You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:15:15