C语言如何实现用户选择控制程序循环重启或退出
问题排查
char * another是未初始化的野指针,没有分配有效的内存空间,直接使用scanf("%s", another)会触发非法内存访问,导致程序崩溃。- C语言中不能直接用
==比较字符串内容,该操作符只会对比两个指针的内存地址,不会匹配字符串实际值,需要使用string.h头文件提供的strcmp函数完成字符串比较。 - 循环结构逻辑混乱:外层的重复计算循环缺少对应的
do关键字,累加、变量重置逻辑的位置错误,多次计算时start、sum、Input变量不会重置,会导致后续计算结果错误。 - 输入数字后的残留换行符会干扰后续的字符输入,需要处理输入缓冲区残留内容。
- 输入合法性校验逻辑语义不清晰,用
start < x判断输入是否大于0不如直接判断x > 0直观。
修复后完整代码
#include <stdio.h> #include <string.h> int main(void) { char another[2]; int start, x, Input, sum; do { // 每次计算前重置变量 start = 0; x = 0; Input = 0; sum = 0; // 输入合法值校验 do { printf("Please enter a number greater than zero to sum up to:\n"); scanf("%d", &x); // 清空输入缓冲区残留的换行符 while(getchar() != '\n'); if(x > 0) Input = 1; else printf("The number needs to be greater than zero.\n"); } while (Input == 0); // 累加计算 while (start <= x) { sum += start; start++; } printf("The sum of the numbers 0 to %d is: %d\n" ,x , sum); // 询问是否继续 printf("Would you like to sum another number? Y/N:"); scanf("%s", another); while(getchar() != '\n'); } while ((strcmp(another, "y") == 0) || (strcmp(another, "Y") == 0)); return 0; }
核心修改说明
- 将
another修改为长度为2的char数组,分配了足够存储单个字符和字符串结束符的内存空间,解决野指针问题。 - 引入
<string.h>头文件,使用strcmp函数对比输入内容,解决字符串比较逻辑错误的问题。 - 重构循环结构,将完整的计算流程放在外层do-while循环内,每次计算前重置所有相关变量,保证多次计算的结果正确。
- 添加了输入缓冲区清空逻辑,避免前一次输入残留的换行符干扰后续输入读取。
- 简化了累加和结果输出的逻辑,去除了不必要的嵌套判断,代码可读性更高。
内容的提问来源于stack exchange,提问作者walkam
相关产品推荐
相关产品推荐

