C语言中如何用for循环比较用户输入字符串与字符串数组?
问题分析与修复方案
核心错误点
- 字符串数组长度不足:
char convert[] = "";定义的数组仅能容纳空字符(长度为1),用户输入的字符串(比如"ABC")会超出数组边界,触发内存越界访问,破坏相邻变量(比如compare)的内存值,导致strcmp结果异常、逻辑判断出错。 - 未初始化变量:
int compare;未初始化,其初始值是随机垃圾值,可能导致后续的if (compare != 1)判断逻辑混乱。 - scanf参数错误:
scanf("%s",&convert);中convert本身就是数组首地址,不需要加&,这是规范问题。 - 递归调用风险:用递归
converter()实现重复输入,多次输入错误会导致栈溢出,不如用循环更安全。
修复后的代码
#include <stdio.h> #include <string.h> void converter(); int main() { converter(); return 0; } void converter(){ // 定义足够长度的数组,容纳最长输入(数组元素是3个字符+结束符,设4足够) char convert[4]; // 初始化compare为0,默认未匹配 int compare = 0; char List[10][4] = {"ABC","DEF","GHI","JKL","MNO","PQR","STU","VWX","YZA"}; printf("Which one do you want to select : \n"); for(int i=0 ; i<9 ; i++){ printf("%s \n",List[i]); } // 用循环实现重复输入,替代递归 while(1){ printf("Please select One : "); // scanf直接传convert,不需要& scanf("%s", convert); compare = 0; for (int j=0 ; j<9 ; j++) { if (strcmp(convert, List[j]) == 0){ compare = 1; break; } } if(compare == 1){ break; // 匹配成功,退出循环 } else { printf("Sorry your selected item is not valid. Please enter a valid selection \n"); } } printf("Ok we can proceed now"); }
关键修复说明
- 调整数组大小:将
convert定义为char convert[4];,刚好能容纳3个字符的输入加上字符串结束符\0,避免内存越界。 - 初始化变量:
int compare = 0;确保初始状态为未匹配,逻辑判断更可靠。 - 修正scanf参数:去掉
&,直接传入convert(数组名本身就是首地址)。 - 替换递归为循环:用
while(1)循环实现重复输入请求,避免递归导致的栈溢出风险。 - 优化匹配逻辑:每次循环重置
compare为0,确保每次输入的判断都是独立的。
内容的提问来源于stack exchange,提问作者Pratya Duti Mishra
相关产品推荐
相关产品推荐

