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
相关产品推荐
相关产品推荐

