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

C语言字符计数重复累加问题:代码异常排查与修复求助

问题修复方案

问题描述

我想要编写一段C语言代码,逐个统计输入的字符,不计空格和作为终止标记(MARK)的“.”。但当前代码中i+=hitungkarakter的累加逻辑会重复计数:直接输入“.”时运行正常,输入其他字符则出现重复计数情况,示例输入输出如下:

f
1
m
2
3
k
4
5
.
6

当前代码

#include "boolean.h"

#include <stdio.h>
#define MARK '.'

char currentChar;
boolean EOP;


void ADV(){
    if(currentChar == MARK){
        EOP = true;
    } else{
        scanf("%c",&currentChar);
    }
}

void START(){
    scanf("%c",&currentChar);
    if(currentChar == MARK){
        EOP = true;
    } 
}

char GetCC(){
    return currentChar;
}
boolean IsEOP(){
    return (currentChar==MARK);
}


int hitungkarakter(char karakter)
{
    int i = 0;
    if(karakter != " " && karakter != MARK){
        i++ ;
    }
    return i;
}

int main(){
    START();
    int i = 0;
    while(!IsEOP()){
        i+=hitungkarakter(currentChar);
        ADV();
        printf("%d\n",i);
    }
}

错误分析与修复步骤

1. 字符比较逻辑错误(核心问题)

hitungkarakter函数中,karakter != " "是字符与字符串字面量的地址比较,而非字符值比较,这个条件永远为真,导致空格无法被排除。同时输入时的换行符'\n'(回车)也会被当成有效字符计数,这是重复计数的主要原因。

修复:将" "改为' '(单引号包裹的单个空格字符),同时添加对换行符'\n'的判断,排除回车干扰:

int hitungkarakter(char karakter)
{
    int i = 0;
    if(karakter != ' ' && karakter != '\n' && karakter != MARK){
        i++ ;
    }
    return i;
}

2. 未初始化EOP变量

START函数中,当读取的初始字符不是MARK时,EOP变量未被赋值,其值为未定义状态,可能导致循环逻辑异常。

修复:在START函数中统一初始化EOP状态:

void START(){
    scanf("%c",&currentChar);
    EOP = (currentChar == MARK);
}

3. ADV函数逻辑优化

原ADV函数仅在当前字符是MARK时设置EOP,读取新字符后未更新EOP状态。调整逻辑,确保每次读取新字符后都判断是否到达终止标记:

void ADV(){
    scanf("%c",&currentChar);
    EOP = (currentChar == MARK);
}

4. 优化打印逻辑(可选)

原main函数中每次循环都会打印计数,包括处理回车时的情况。添加判断,仅在处理有效字符后打印,避免多余的空计数输出:

int main(){
    START();
    int i = 0;
    while(!IsEOP()){
        int add = hitungkarakter(currentChar);
        i += add;
        ADV();
        // 仅在统计到有效字符时打印
        if(add > 0){
            printf("%d\n",i);
        }
    }
}

修复后的完整代码

#include "boolean.h"

#include <stdio.h>
#define MARK '.'

char currentChar;
boolean EOP;


void ADV(){
    scanf("%c",&currentChar);
    EOP = (currentChar == MARK);
}

void START(){
    scanf("%c",&currentChar);
    EOP = (currentChar == MARK);
}

char GetCC(){
    return currentChar;
}
boolean IsEOP(){
    return EOP;
}


int hitungkarakter(char karakter)
{
    int i = 0;
    if(karakter != ' ' && karakter != '\n' && karakter != MARK){
        i++ ;
    }
    return i;
}

int main(){
    START();
    int i = 0;
    while(!IsEOP()){
        int add = hitungkarakter(currentChar);
        i += add;
        ADV();
        if(add > 0){
            printf("%d\n",i);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:05:25