C语言实现句子单词分行打印时末尾出现异常字符问题求助
问题解决:将句子单词逐行打印并修复末尾多余字符
你当前的代码能实现基本的单词逐行打印,但行末尾出现多余字符,核心问题出在循环逻辑和边界判断上,具体分析如下:
- 循环条件
i<1024;i++ ||check<=2逻辑错误,会导致循环超出输入字符串的实际长度,访问内存中不属于该字符串的垃圾数据,这就是末尾多余字符的来源 - 未判断字符串结束符
'\0',循环强制执行1024次,必然会打印不属于输入内容的内存垃圾 check变量的设计冗余,反而干扰了正常的循环终止逻辑- 变量
i定义为char类型不合适,字符串长度可能超过char的取值范围,应改为int或size_t
规范代码实现
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 初始分配足够内存 char *s = malloc(1024 * sizeof(char)); if (s == NULL) { perror("malloc failed"); return 1; } // 读取整行输入(包含空格) if (scanf("%[^\n]", s) != 1) { fprintf(stderr, "input error\n"); free(s); return 1; } // 重新分配到实际需要的大小 size_t len = strlen(s); char *temp = realloc(s, len + 1); if (temp != NULL) { s = temp; } int in_word = 0; // 标记是否在单词中,避免连续空格多次换行 for (size_t i = 0; s[i] != '\0'; i++) { if (s[i] != ' ') { printf("%c", s[i]); in_word = 1; } else { // 只有当前在单词中时才换行,避免连续空格输出多个空行 if (in_word) { printf("\n"); in_word = 0; } } } // 最后一个单词后换行(可选,根据需求调整) if (in_word) { printf("\n"); } free(s); return 0; }
代码说明
- 增加了内存分配失败的错误处理,避免空指针访问
- 循环以字符串结束符
'\0'为终止条件,确保只处理输入的有效内容 - 用
in_word变量处理连续空格的情况,避免输出多余空行 - 使用
size_t类型遍历字符串,匹配strlen的返回值类型,更规范 - 最后释放分配的内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者Ghimire Suraj
相关产品推荐
相关产品推荐

