C语言统计空格存储位置时为何末尾额外输出0?
C语言代码问题解答:多余输出"Spaces : 0"的原因
问题描述
我编写了一段C语言代码,用于统计输入文本中空格在字符数组中的存储位置,同时统计非空格字符的数量。但运行程序时,除正常输出空格位置外,最后总会额外输出“Spaces : 0”。将for循环条件从i<=c改为i<c后问题解决,推测e[c]的值为0,想请教为何数组e的该位置会是0?
原代码
#include <stdio.h> #include <conio.h> void main() { int a = 0, b = 0, c = 0, e[10000]; char d[10000]; printf("Enter text: "); gets(d); while(d[a] != '\0') { if(d[a] != ' ') { b++; } else { e[c]=a; c++; } a++; } printf("Number of characters without spaces: %d\n", b); for(int i=0; i<=c; i++) printf("Spaces : %d \n", e[i] ); getch(); }
原因解析
1. 未初始化局部变量的特性
在C语言中,函数内部定义的局部变量(包括数组)如果没有显式初始化,其内存空间会保留栈上的残留数据,值是不确定的(属于未定义行为)。你看到e[c]的值为0只是巧合,换个运行环境或程序状态,这个位置可能会输出其他随机数。
2. 代码逻辑的边界问题
变量c的作用是统计输入文本中的空格数量:每遇到一个空格,就将其位置存入e[c],随后c自增1。循环结束后,c的值等于实际空格的总数——有效数据仅存储在e[0]到e[c-1]的位置,e[c]从未被赋值,属于未初始化的内存区域。
原来的for循环条件i<=c会让程序多执行一次循环(当i=c时),此时访问的e[c]是未初始化的元素,因此会输出一个无意义的值(你这里刚好是0)。改成i<c后,循环仅遍历所有有效的空格位置,自然不会出现多余输出。
额外优化建议
- 废弃
gets()函数:它存在严重的缓冲区溢出风险,建议替换为fgets(d, sizeof(d), stdin)。 - 显式初始化局部变量:比如将数组初始化改为
int e[10000] = {0};,避免未定义行为。 - 遵循标准C写法:
void main()不是标准写法,推荐使用int main(void),并在函数末尾添加return 0;。
内容的提问来源于stack exchange,提问作者Adyansh Mishra
相关产品推荐
相关产品推荐

