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

C++字符串非空格字符统计功能异常,请求代码排查帮助

问题排查与修正:统计字符串非空格字符的C++函数错误

核心问题分析

  • 统计逻辑偏离需求:你需要统计的是非空格字符,但代码中使用isalpha()函数,该函数仅判断字符是否为字母,会忽略数字、标点等其他非空格字符。
  • 数组长度计算错误:sizeof(s)/sizeof(s[0])得到的是字符数组的总容量(100),而非输入字符串的实际长度。循环遍历整个数组时,会把数组中未初始化的随机垃圾字符纳入判断,导致计数结果随机波动(比如输出10、6这类无意义数值)。
  • 使用废弃不安全函数:gets()函数已在C++11中被废弃,它无法限制输入长度,存在缓冲区溢出的风险。

修正后的代码方案

方案1:基于字符数组的修正版本

#include <iostream>
#include <cstring>  // 用于strlen函数处理字符串长度
using namespace std; 

int countNonSpaceChars(char s[], int actualLength) {
    int count = 0;
    for (int i = 0; i < actualLength; i++) {
        if (s[i] != ' ') {  // 直接判断是否为非空格字符
            count++;
        }
    }
    return count; 
}

int main() {
    char s[100]; 
    // 使用fgets安全读取输入,避免缓冲区溢出
    fgets(s, sizeof(s), stdin);
    // 去除fgets读取到的换行符(如果存在)
    size_t len = strlen(s);
    if (len > 0 && s[len - 1] == '\n') {
        s[len - 1] = '\0';
        len--;
    }
    cout << countNonSpaceChars(s, len) << endl;
    return 0;
}

方案2:使用C++ std::string简化实现(更推荐)

#include <iostream>
#include <string>
using namespace std;

int countNonSpaceChars(const string& s) {
    int count = 0;
    for (char c : s) {
        if (c != ' ') {
            count++;
        }
    }
    return count;
}

int main() {
    string s;
    getline(cin, s);  // 读取整行输入,支持包含空格的字符串
    cout << countNonSpaceChars(s) << endl;
    return 0;
}

补充说明

如果你的真实需求是统计字母而非所有非空格字符,只需将判断条件改回isalpha(s[i]),但仍需保留用字符串实际长度替代数组总容量的修正逻辑,避免垃圾字符干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:40:31