C语言反转字符串单词顺序时输出异常、单词计数偏差问题求助
问题根因
- 多余换行的原因:
fgets函数读取用户输入时会把末尾的回车换行符\n一并存入输入缓冲区,你的代码初始end指针指向了这个\n的位置,拷贝第一个单词时会把\n也写入结果数组,就出现了多余的换行。 - 计数少1的原因:你当前的计数逻辑只有遇到空格时才累加,统计的实际是单词之间的分隔符数量,N个单词对应N-1个分隔符,最后一个(原字符串最开头的)单词拷贝完成后没有触发计数,所以最终结果比实际少1。此处后续补充的计数是逻辑补全,不属于临时补丁。
修复方案
- 首先处理
fgets读取的换行符,在获取字符串长度后先移除末尾的\n:
length = strlen(ent); // 新增代码 移除fgets带入的换行符 if (length > 0 && ent[length - 1] == '\n') { ent[length - 1] = '\0'; length--; } start = length - 1; end = length - 1;
- 在最后拷贝完开头的单词后,补充对应最后一个单词的计数:
for (i = 0; i <= end; i++) { rev[j] = ent[i]; j++; } // 新增代码 最后一个单词拷贝完成 计数加1 count++;
修复后完整代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main(void) { char ent[50], rev[50]; int length, i = 0, start, end, j = 0, count = 0, k; printf("Enter a statement: "); fgets(ent, 50, stdin); length = strlen(ent); // 移除fgets带入的换行符 if (length > 0 && ent[length - 1] == '\n') { ent[length - 1] = '\0'; length--; } start = length - 1; end = length - 1; while (start > 0) { if (ent[start] == ' ') { i = start + 1; count++; while (i <= end) { rev[j] = ent[i]; i++; j++; } rev[j++] = ' '; end = start - 1; } start--; } for (i = 0; i <= end; i++) { rev[j] = ent[i]; j++; } // 补充最后一个单词的计数 count++; rev[j] = '\0'; printf("Reversed statement: %s\n", rev); printf("Words in statement: %d\n", count); return(0); }
内容的提问来源于stack exchange,提问作者printingwrong3434
相关产品推荐
相关产品推荐

