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

C语言中strcmp对比键盘输入"quit"不生效问题排查求助

问题分析与修复方案

嘿,我发现你的代码里有两个关键问题导致strcmp没法正确匹配"quit",咱们一步步拆解:

1. 字符串终止符缺失(核心问题)

你定义了char q[4] = "quit";,但C语言里的字符串必须以'\0'作为结束标记。"quit"这个字符串实际包含5个字符:'q'、'u'、'i'、't'、'\0',而你给q只分配了4个字节的空间,根本装不下最后的'\0'。

这就导致strcmp在比较的时候,会从q的内存位置一直往后读,直到找到某个'\0'为止,这时候它读到的内容和你输入的"quit"(正常带'\0')肯定不一样,自然不会返回0。

2. scanf的参数错误

你写的scanf("%s",&str);是错的:str本身就是数组的首地址(类型是char*),完全符合scanf对%s参数的要求。而&str是指向整个数组的指针(类型是char(*)[10]),虽然有些编译器可能会睁一只眼闭一只眼,但这不符合规范,容易引发奇怪的内存问题,改成scanf("%s", str);就对了。

另外还有个小坑:你写的//Quit LAND:不是有效的标签,goto要找的标签得是LAND:这种格式,注释别跟标签混在一起。

修复后的完整代码

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

int numInput(){
    char str[10];
    int num;
    char nStr[10];
    // 直接用字符串初始化,让编译器自动分配足够空间(包括'\0')
    char q[] = "quit"; 
    // 正确的标签定义
    LAND:
    // 修正scanf参数,同时限制读取长度防止缓冲区溢出
    scanf("%9s", str);
    if (strcmp(q, str) == 0){ //Here quit is implemented
        exit(0);
    }else{
        // 建议用格式化输出,避免潜在的格式安全问题
        printf("%s\n", str);
    }
    num = atoi(str);
    itoa(num, nStr, 10);
    if (strcmp(nStr, str) != 0){
        printf("Please enter numbers only!\nEnter number here:");
        goto LAND;
    }
    return num;
}

额外小建议

  • 尽量少用goto,可以换成do-while循环,代码结构会更清晰易读。
  • 用scanf读字符串时,最好加上长度限制(比如%9s),防止用户输入过长导致缓冲区溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:47:43