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

C语言元音统计程序数组越界致跨数组访问问题排查

统计元音数量程序的错误分析与修复

问题根源

你的程序出现两个异常的核心原因是:vowels数组没有以空字符'\0'结尾。

  • 用char vowels[] = {'a','e','i','o','u'};初始化数组时,只会存入5个元音字符,不会自动添加字符串结束符'\0'。
  • 内层for循环的终止条件是vowels[i] != '\0',由于数组里没有'\0',循环会越界访问后续内存区域。刚好name数组在内存中可能紧邻vowels,所以会把name的元素当成vowels的一部分输出。
  • 越界后循环会一直找'\0',直到碰到name末尾的'\0'才停止,这导致每个姓名字符都被和一堆额外字符(包括name的内容)比较,最终vowCount累加了name的长度。

修复方案(三种可选)

方案1:给vowels手动添加'\0'

修改数组初始化代码:

char vowels[] = {'a','e','i','o','u', '\0'};

方案2:用字符串字面量初始化(自动带'\0')

更简洁的写法,字符串字面量默认会在末尾添加'\0':

char vowels[] = "aeiou";

方案3:用数组长度控制内层循环(避免依赖'\0')

既然知道vowels固定有5个元素,直接用长度判断终止条件,更安全:

// 内层循环修改为
for(uint8_t i = 0; i < sizeof(vowels)/sizeof(vowels[0]); i++){
    printf("COMPARING WITH VOWEL: %c\n", vowels[i]);
    if(test == vowels[i]){
        vowCount++;
    }
}

修正后的完整代码(以方案2为例)

#include <stdio.h>
#include <string.h>
using namespace std;

int main() {
    char name[20];
    char vowels[] = "aeiou"; // 用字符串字面量自动带'\0'
    int vowCount = 0;

    printf("Enter your name: ");
    scanf("%19s", name);
    for(uint16_t counter = 0; name[counter] != '\0'; counter++ ){
        char test = name[counter];

        printf("CHECKING: %c \n", test);
        for(uint8_t i = 0; vowels[i] != '\0'; i++){
            printf("COMPARING WITH VOWEL: %c\n", vowels[i]);
            if(test == vowels[i]){
                vowCount++;
            }
        }
    }

    printf("\n%i", vowCount);
    return 0; // 建议添加main函数的返回值
}

额外提醒:你的代码混合了C和C特性(比如using namespace std;是C语法,scanf是C标准库函数),如果写C程序可以去掉using namespace std;,如果写C++程序建议用cin/cout替代scanf/printf,保持风格统一。

内容的提问来源于stack exchange,提问作者zach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:55:17