使用指针逐词输出字符串的C语言程序问题排查
解决C语言指针逐词输出句子的问题
嘿,我来帮你排查这个逐词输出程序的问题~先拆解下你的代码里的核心问题:
原代码里的两个关键问题
- 输入读取不完整:你用了
scanf("%s", str),但%s格式符会在遇到空格、制表符或换行时停止读取,所以你的str里永远只能存下输入的第一个单词,后面的内容根本没被读进数组里,自然没法处理多单词的句子。 - 逐词逻辑有瑕疵:就算能读到空格,你的逻辑是遇到一个空格就换一行,要是输入里有连续空格,就会输出好几行空行,而且没有清晰处理“单词结束后换行”的逻辑。
修正后的代码
#include <stdio.h> #include <string.h> int main() { char str[100]; char *p; printf("Sentence: "); // 用fgets读取整行输入,包含空格 fgets(str, sizeof(str), stdin); // 去掉fgets读入的末尾换行符 str[strcspn(str, "\n")] = '\0'; p = str; while (*p != '\0') { // 跳过连续的空格,避免空行 while (*p == ' ' && *p != '\0') { p++; } // 输出当前单词的所有字符,直到遇到空格或字符串结束 while (*p != ' ' && *p != '\0') { printf("%c", *p); p++; } // 每输出一个单词就换行(排除末尾空格导致的空行) if (*(p-1) != ' ') { printf("\n"); } } return 0; }
关键改动说明
- 替换输入方式:用
fgets替代scanf("%s"),fgets可以读取整行内容(包括空格),最多读取sizeof(str)-1个字符,自动在末尾添加\0。 - 处理换行符:
fgets会把输入时的换行符也读进来,用strcspn定位换行符位置并替换成\0,避免后续逻辑出错。 - 优化逐词逻辑:
- 先跳过连续空格,避免输出空行;
- 逐个输出字符直到遇到空格或字符串结束,完整输出单个单词;
- 输出完单词后换行,同时判断避免末尾空格导致的多余空行。
这样修改后,就能正确读取整句输入,并且逐词每行输出一个单词啦~
内容的提问来源于stack exchange,提问作者Luka Milicevic
相关产品推荐
相关产品推荐

