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

C语言字符统计函数异常:返回字符串长度而非目标字符出现次数

问题分析与解决:统计字符出现次数返回字符串长度的原因

你的代码存在两个关键错误,共同导致了返回字符串长度的结果:

1. 条件判断用了赋值运算符而非比较运算符

在countLetters函数的if语句中,你错误地使用了赋值运算符=,而不是用于比较的**==**:

if(string1[i] = letter){ // 错误:将letter赋值给string1[i],而非比较

这个操作会把letter的值赋给string1[i],而赋值表达式的结果就是letter本身。只要letter不是空字符'\0',该表达式会被视为逻辑真,循环的每一次迭代都会让count加1,最终count就等于字符串的长度。

修正:将=替换为==:

if(string1[i] == letter){ // 正确:比较两个字符是否相等

2. 输入缓冲区残留换行符导致读取错误

fgets会把用户输入字符串时按下的回车键(换行符\n)一并读取到string1中。之后调用scanf("%c", &letter)时,它会直接读取输入缓冲区中残留的\n,而不是你后续输入的目标字符。结合第一个错误,此时letter的值是\n,赋值给每个字符串字符后条件始终为真,最终统计的就是字符串的长度。

修正:有两种常见解决方式:

  • 方式一:在scanf前调用getchar()丢弃换行符
printf("\nEnter character to be searched: \n");
getchar(); // 读取并丢弃fgets留下的换行符
scanf("%c", &letter);
  • 方式二:在scanf的格式字符串前加空格,自动忽略空白字符(包括换行符)
scanf(" %c", &letter); // 空格会跳过所有前置空白字符

修正后的完整代码

#include <stdio.h>
#include <string.h>

int countLetters(char *string1, char letter){   
    int count=0;

    for(int i=0; i<strlen(string1); i++){
        if(string1[i] == letter){ // 修正比较运算符
            count++;
        }
    }    
    return count;
}

int main(){
    char string1[200];
    char letter;
    int count;

    printf("\nEnter the string: \n");
    fgets(string1, 200, stdin);

    printf("\nEnter character to be searched: \n");
    scanf(" %c", &letter); // 修正输入读取,忽略换行符
    
    count = countLetters(string1, letter);

    printf("\nThe number of occurrences: %d", count);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:15:48