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

C代码执行时重复触发if-else的else分支问题求助

问题:C程序始终执行else分支,持续输出"ano??"

运行编写的C代码时,程序始终重复执行if-else语句的else分支,仅持续输出"ano??"。已尝试用sscanf防止缓冲区溢出,但问题未解决,在Sublime Text、Turbo C、VS Code等环境测试均出现相同问题。

相关代码如下:

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

void anongArawNgayon()
{
    time_t now = time(NULL);
    char* anongAraw = ctime(&now);
    printf("%s", anongAraw);
}

int scanner(const char *data, char *buffer, size_t buflen)
{
    char format[30];
    if (buflen == 0)
        return 0;
    snprintf(format, sizeof(format), "%%%ds", (int)(buflen-1));
    return sscanf(data, format, buffer);
}

int main()
{
    char input[30];
    bool tuloyLang = true;

    anongArawNgayon();
    while (tuloyLang)
    {
        printf("\n");
        printf("di makapagdrive si papa, tuloy ba bukas?\n");
        sscanf("%29s", input, sizeof(input));

        if(strcmp(input, "tuloy")==0)
        {
            for (int i=0; i=15; i++)
            {
                printf("Okay magbihis na kayo\n");
            }
            printf("pero si adriaan ang magdridrive");
        }
        else if(strcmp(input, "hindi")==0)
        {
            for (int i=0; i=15; i++)
            {
                printf("Patay ah");
            }
            printf("commute na lang");
        }
        else if(strcmp(input, "sira")==0)
        {
            break;
        }
        else
        {
            printf("ano??");
        }
    }
    return 0;
}

问题分析

  1. 输入读取错误:sscanf("%29s", input, sizeof(input))用法完全错误。sscanf的第一个参数是要解析的数据源字符串,而非格式字符串。这导致input从未被正确赋值为用户输入,strcmp无法匹配任何预设值,直接进入else分支。
  2. for循环条件错误:for (int i=0; i=15; i++)中的i=15是赋值操作,而非判断条件。赋值后i恒为15(非零),会导致循环无限执行,即使输入匹配了"tuloy"或"hindi",程序也会卡死在循环里。
  3. 未使用定义的scanner函数:你定义了scanner函数但未调用,该函数用于从字符串读取内容,而你需要读取用户输入,应使用scanf或fgets。

修复后的代码

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

void anongArawNgayon()
{
    time_t now = time(NULL);
    char* anongAraw = ctime(&now);
    printf("%s", anongAraw);
}

int main()
{
    char input[30];
    bool tuloyLang = true;

    anongArawNgayon();
    while (tuloyLang)
    {
        printf("\n");
        printf("di makapagdrive si papa, tuloy ba bukas?\n");
        // 使用fgets读取用户输入,避免缓冲区溢出
        if (fgets(input, sizeof(input), stdin) == NULL) {
            break;
        }
        // 移除fgets读取到的换行符,避免影响strcmp匹配
        input[strcspn(input, "\n")] = '\0';

        if(strcmp(input, "tuloy")==0)
        {
            for (int i=0; i<15; i++) // 修正循环条件,执行15次后结束
            {
                printf("Okay magbihis na kayo\n");
            }
            printf("pero si adriaan ang magdridrive\n");
        }
        else if(strcmp(input, "hindi")==0)
        {
            for (int i=0; i<15; i++) // 修正循环条件
            {
                printf("Patay ah\n");
            }
            printf("commute na lang\n");
        }
        else if(strcmp(input, "sira")==0)
        {
            break;
        }
        else
        {
            printf("ano??\n");
        }
    }
    return 0;
}

关键修改说明

  • 替换错误的sscanf调用为fgets,确保正确读取用户输入,同时限制读取长度避免缓冲区溢出。
  • 用strcspn移除fgets读取的换行符,否则输入内容会带有换行,导致strcmp匹配失败。
  • 把所有for循环的i=15改为i<15,让循环执行15次后正常结束。
  • 在printf末尾添加换行符,优化输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:12:07