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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:36:02