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; }
错误原因分析
句子长度判断逻辑错误
要从第三个单词开始打印,句子至少需要3个单词(对应2个空格分隔符)。但当前代码判断count < 3时提示句子太短,这会导致有2个空格的合法输入(3个单词)被误判为不符合要求,无法进入打印分支。用户可能因无法测试3个单词的场景,误以为代码从第二个单词开始输出。潜在的效率与冗余问题
第二个循环中每次调用strlen(arr)会重复遍历字符串计算长度,影响执行效率;且找到目标位置后未及时跳出循环,会继续遍历剩余字符做无用功。未处理
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
相关产品推荐
相关产品推荐

