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

C语言字符串元音辅音分离程序计数器异常问题求助

问题根源分析与修复方案

核心问题1:值传递导致计数器修改无效

C语言函数参数默认是值传递——传递的是变量的副本,函数内部对参数的修改只会作用于这个副本,完全不会影响主函数里的原始变量。

以你的代码为例,调用checkcon(inp[i],con,conno)时,conno的当前值会被复制给函数内的counter参数。函数里执行counter = counter + 1,只是修改了这个局部副本,主函数中的conno根本不会变化,所以最终输出的辅音数量始终是初始值0。

而你看到的Con : 1重复出现,是因为每次调用checkcon时,传入的counter都是主函数里conno的初始值0,加1后变成1,但下次调用又会重新传入0,自然每次输出都是1。

核心问题2:未初始化变量产生垃圾值

代码中int vowno,conno = 0;这行只初始化了conno,vowno没有被赋值,它的值是内存中残留的随机垃圾数据。你看到的Vow : 15081和最终输出的15080,都是这个垃圾值加1后的结果,完全不可控。

额外问题:循环边界错误

主函数中的for (int i=0;i<=length;i++)存在逻辑问题:length是字符串的有效长度,字符索引范围是0 ~ length-1,i=length对应的是字符串结束符'\0',没必要处理这个字符,应改为i < length。

修复方案

方案1:使用指针传递计数器

通过指针让函数直接修改主函数中的变量:

修改checkcon和checkvow的参数与实现:

void checkcon(char letter, char string[], int *counter)
{
    char consonants[] = "bcdfghjklmnpqrstvwxyz";
    for (int i=0; i<strlen(consonants); i++)
    {
        if (letter == consonants[i])
        {
            append(string, letter);
            (*counter)++;
            printf("Con : %d\n", *counter);
        }
    }
}

void checkvow(char letter, char string[], int *counter)
{
    char vowels[] = "aeiou";
    for (int i=0; i<strlen(vowels); i++)
    {
        if (letter == vowels[i])
        {
            append(string, letter);
            (*counter)++;
            printf("Vow : %d\n", *counter);
        }
    }
}

主函数中调用时传入变量地址,同时初始化两个计数器:

int vowno = 0, conno = 0;
// ...
for (int i=0; i<length; i++)
{
    checkcon(inp[i], con, &conno);
    checkvow(inp[i], vow, &vowno);
}

方案2:让函数返回更新后的计数器值

将函数改为int类型,返回修改后的计数器值:

修改函数实现:

int checkcon(char letter, char string[], int counter)
{
    char consonants[] = "bcdfghjklmnpqrstvwxyz";
    for (int i=0; i<strlen(consonants); i++)
    {
        if (letter == consonants[i])
        {
            append(string, letter);
            counter++;
            printf("Con : %d\n", counter);
        }
    }
    return counter;
}

int checkvow(char letter, char string[], int counter)
{
    char vowels[] = "aeiou";
    for (int i=0; i<strlen(vowels); i++)
    {
        if (letter == vowels[i])
        {
            append(string, letter);
            counter++;
            printf("Vow : %d\n", counter);
        }
    }
    return counter;
}

主函数调用时接收返回值:

int vowno = 0, conno = 0;
// ...
for (int i=0; i<length; i++)
{
    conno = checkcon(inp[i], con, conno);
    vowno = checkvow(inp[i], vow, vowno);
}

优化建议

  • 用strlen()代替硬编码的字符数组长度,避免因字符修改导致的长度错误。
  • 简化append函数,直接操作字符串末尾比strcat更高效:
void append(char string[], char letter)
{
    int len = strlen(string);
    string[len] = letter;
    string[len+1] = '\0';
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:13:19