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; }
代码细节说明:
fgets的正确使用:fgets(s, MAX, stdin)会读取最多MAX-1个字符(要留位置给终止符\0),直到遇到换行符或文件结束,完美支持含空格的整行输入。- 处理换行符:
fgets会把输入的换行符也存入字符串,所以我们用strlen找到末尾,把换行符替换成\0,避免后续处理时遇到多余的换行。 - 数字转换与累加:遍历每个字符,判断是否在
'0'到'9'之间,利用ASCII码的差值(s[i] - '0')把字符转换成整数,加到总和里。 - 格式输出控制:用
first_num变量标记第一个数字,第一个数字直接输出,后面的数字前加+,最后输出=总和,和你给出的示例格式完全匹配。
测试你提供的示例输入:abc3x casa2 y34zq,程序会输出3+2+3+4=12,完全符合需求。
内容的提问来源于stack exchange,提问作者umberto mauro
相关产品推荐
相关产品推荐

