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

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");
}

关键修复说明

  1. 调整数组大小:将convert定义为char convert[4];,刚好能容纳3个字符的输入加上字符串结束符\0,避免内存越界。
  2. 初始化变量:int compare = 0;确保初始状态为未匹配,逻辑判断更可靠。
  3. 修正scanf参数:去掉&,直接传入convert(数组名本身就是首地址)。
  4. 替换递归为循环:用while(1)循环实现重复输入请求,避免递归导致的栈溢出风险。
  5. 优化匹配逻辑:每次循环重置compare为0,确保每次输入的判断都是独立的。

内容的提问来源于stack exchange,提问作者Pratya Duti Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:07:04