You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言程序问题:无法从第三个单词开始打印句子求排查

问题排查:从第三个单词开始打印句子的C程序错误分析

问题描述

需求:编写一个程序,允许用户输入一个句子,程序需从第三个单词开始打印该句子。示例:输入句子「Welcome to the course in programming」,输出「the course in programming」。
问题:当前代码仅能从第二个单词开始打印(或无法处理3个单词的输入),请求排查错误。

用户提供的代码:

#include <stdio.h>
#include <string.h>

#define SIZE 100

int main(void)
{

    char arr[SIZE];
    char* p = NULL;


        int count = 0;
        printf("Enter a sentence:");
        fgets(arr, SIZE, stdin);
        for (int i = 0; i < SIZE; i++) {
            if (arr[i] == ' ') {
                count++;

            }
        }
        if (count < 3 ) {
            printf("The sentence is to short!\n");
        }
        else {
            count = 0;
            for (int i = 0; i < strlen(arr); i++) {
                if (arr[i] == ' ') {
                    count++;
                }
                if (count == 2) {
                    p = &arr[i + 1];
                }
                
            }printf("%s\n", p);
            
        }
        return 0;
   
}

错误原因分析

  1. 句子长度判断逻辑错误
    要从第三个单词开始打印,句子至少需要3个单词(对应2个空格分隔符)。但当前代码判断count < 3时提示句子太短,这会导致有2个空格的合法输入(3个单词)被误判为不符合要求,无法进入打印分支。用户可能因无法测试3个单词的场景,误以为代码从第二个单词开始输出。

  2. 潜在的效率与冗余问题
    第二个循环中每次调用strlen(arr)会重复遍历字符串计算长度,影响执行效率;且找到目标位置后未及时跳出循环,会继续遍历剩余字符做无用功。

  3. 未处理fgets读入的换行符
    fgets会将输入末尾的换行符存入数组,导致输出结果可能带有多余的换行。

修正后的代码

#include <stdio.h>
#include <string.h>

#define SIZE 100

int main(void)
{
    char arr[SIZE];
    char* p = NULL;
    int count = 0;

    printf("Enter a sentence:");
    fgets(arr, SIZE, stdin);
    
    // 去掉fgets读入的换行符
    arr[strcspn(arr, "\n")] = '\0';

    // 统计空格数量
    int len = strlen(arr);
    for (int i = 0; i < len; i++) {
        if (arr[i] == ' ') {
            count++;
        }
    }

    // 判断是否满足至少3个单词(2个空格)
    if (count < 2) {
        printf("The sentence is too short!\n");
    } else {
        count = 0;
        for (int i = 0; i < len; i++) {
            if (arr[i] == ' ') {
                count++;
            }
            // 找到第二个空格后,指向第三个单词的开头并跳出循环
            if (count == 2) {
                p = &arr[i + 1];
                break;
            }
        }
        printf("%s\n", p);
    }

    return 0;
}

修正说明

  • 调整句子长度判断条件为count < 2,确保3个单词的输入能正常进入打印分支。
  • 用strcspn去掉fgets读入的换行符,避免输出多余换行。
  • 将字符串长度存入变量len,避免循环中重复调用strlen。
  • 找到目标位置后添加break语句,终止无意义的后续循环。
  • 修正原代码中的拼写错误to short为too short。

内容的提问来源于stack exchange,提问作者badprogrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:55:18