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

C语言字符串数字求和问题排查及改用fgets实现需求咨询

问题排查与解决方案:计算字符串中所有数字的和(支持含空格的整行输入)

先帮你拆解下原代码里的几个核心问题:

  • scanf("%s", s)的致命局限:scanf用%s读取输入时,遇到空格、制表符或换行就会停止,根本读不到带空格的整行内容,而且它会把输入缓冲区里的空格、换行符留在里面,导致后续getchar循环一开始就读到这些非目标字符,逻辑直接混乱。
  • getchar循环的逻辑错误:你写的while((s[i] = getchar()) != '\n'){ i++; if(...) },这里先把字符赋值给s[i],立刻i++,接下来判断的是s[i](也就是下一个位置的字符),等于刚读入的s[i]永远不会被检查是不是数字,直接跳过了第一个读入的字符。
  • 额外的乱码问题:printf里的“猫”应该是输入失误,需要修正。

接下来是你想要的fgets实现方案,fgets可以完美读取包含空格的整行输入,我们还能实现你示例里的「数字+数字+...=总和」输出格式:

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

#define MAX 100 // 可根据需求调整数组大小

int main() {
    char s[MAX];
    int somma = 0;
    int first_num = 1; // 控制输出格式,避免第一个数字前出现+

    printf("inserisci la stringa : ");
    // 用fgets读取整行,注意fgets会把换行符也读入字符串
    if (fgets(s, MAX, stdin) == NULL) {
        printf("Errore nella lettura della stringa\n");
        return 1;
    }

    // 去掉字符串末尾的换行符(如果存在)
    size_t len = strlen(s);
    if (len > 0 && s[len - 1] == '\n') {
        s[len - 1] = '\0';
    }

    // 遍历字符串每个字符
    for (int i = 0; s[i] != '\0'; i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            int num = s[i] - '0';
            somma += num;

            // 按照示例格式输出累加式
            if (first_num) {
                printf("%d", num);
                first_num = 0;
            } else {
                printf("+%d", num);
            }
        }
    }

    // 输出最终结果
    printf("=%d\n", somma);

    return 0;
}

代码细节说明:

  1. fgets的正确使用:fgets(s, MAX, stdin)会读取最多MAX-1个字符(要留位置给终止符\0),直到遇到换行符或文件结束,完美支持含空格的整行输入。
  2. 处理换行符:fgets会把输入的换行符也存入字符串,所以我们用strlen找到末尾,把换行符替换成\0,避免后续处理时遇到多余的换行。
  3. 数字转换与累加:遍历每个字符,判断是否在'0'到'9'之间,利用ASCII码的差值(s[i] - '0')把字符转换成整数,加到总和里。
  4. 格式输出控制:用first_num变量标记第一个数字,第一个数字直接输出,后面的数字前加+,最后输出=总和,和你给出的示例格式完全匹配。

测试你提供的示例输入:abc3x casa2 y34zq,程序会输出3+2+3+4=12,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:56:35