Windows平台下C语言程序字符输出不符合预期问题求助
C语言程序输出不符合预期的问题分析与修正
问题说明
我在Linux环境下用C99标准编写了一段C程序,输入内容为A B C D E F G H I J K L M N O时:
- 实际输出:
-A-- --B-- --C-- --D-- --E-- --F-- --G-- --H-- --I-- --J-- --K-- --L-- --M-- --N-- --O-- - - 预期输出:
-A--B--C--D--E--F--G--H--I--J--K--L--M--N--O_
原程序代码如下:
int main() { char *arr = safeMalloc(sizeof(char) * 32); int sizeArr = 32; int cou = 0; while (scanf("%c", &arr[cou]) != EOF || cou == 10) { cou++; if(cou == sizeArr-2) { arr = realloc(arr, 2*sizeArr); sizeArr*2; } } for (int i = 0; i < cou; ++i) { printf("-%c-", arr[i]); } printf("\n"); }
代码问题分析
scanf("%c")读取了空白字符:%c格式会读取输入中的所有字符,包括空格、换行符。输入里的空格被存进数组后,输出时会被格式化为- -,这就是实际输出中-- --部分的来源。- 循环条件逻辑错误:
while (scanf(...) != EOF || cou == 10)的逻辑不合理,||会导致即使输入结束(遇到EOF),只要cou ==10就继续循环,可能导致数组越界或多余的循环次数。 - 数组扩容后未更新
sizeArr:sizeArr*2;这行只是计算了值,但没有赋值给sizeArr,导致后续扩容判断失效,可能引发数组越界。 - 输出格式不符合预期:
printf("-%c-", arr[i])会给每个字符(包括空格、换行)前后加横杠,而预期是只给字母添加对应格式,最后以下划线结尾,而非横杠。
修正后的代码
#include <stdio.h> #include <stdlib.h> // 假设safeMalloc是你实现的带错误检查的malloc,这里补一个示例实现 void *safeMalloc(size_t size) { void *ptr = malloc(size); if (!ptr) { perror("malloc failed"); exit(EXIT_FAILURE); } return ptr; } int main() { char *arr = safeMalloc(sizeof(char) * 32); int sizeArr = 32; int cou = 0; char ch; // 用" %c"跳过空白字符(空格、换行等),只读取字母 while (scanf(" %c", &ch) != EOF) { arr[cou] = ch; cou++; // 检查是否需要扩容,预留一个位置给终止符(可选) if(cou == sizeArr - 1) { char *temp = realloc(arr, 2 * sizeArr); if (!temp) { perror("realloc failed"); free(arr); exit(EXIT_FAILURE); } arr = temp; sizeArr *= 2; // 正确更新数组大小 } } // 按预期格式输出 if (cou > 0) { // 第一个字符格式:-A- printf("-%c-", arr[0]); // 后续字符格式:--B--C... for (int i = 1; i < cou; ++i) { printf("--%c", arr[i]); } // 最后添加下划线结尾 printf("_"); } printf("\n"); free(arr); // 记得释放内存 return 0; }
修正点说明
- 使用
scanf(" %c", &ch):前面的空格会自动跳过输入中的空白字符(空格、换行、制表符等),只读取有效字母。 - 修复数组扩容逻辑:将
sizeArr*2;改为sizeArr *= 2;,确保扩容后数组大小正确更新;同时用临时指针接收realloc返回值,避免内存泄漏。 - 调整输出格式:第一个字母输出
-%c-,后续字母输出--%c,最后添加下划线_,完全匹配预期输出。 - 添加内存释放:避免内存泄漏,这是C程序的良好习惯。
内容的提问来源于stack exchange,提问作者MaxVK
相关产品推荐
相关产品推荐

