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

C语言中scanf读取char异常及strcmp指针转换报错问题求助

问题分析与修复方案

咱们一步一步拆解你遇到的问题:

1. 为什么会出现strcmp makes pointer from integer without a cast错误?

strcmp函数是用来比较两个字符串的,它的参数要求是const char*类型(字符串指针)。但你的sortChoice是单个char类型变量,本质上是一个8位的ASCII整数。当你把这个整数传给strcmp时,编译器会把它当成指针地址处理,这完全不符合函数的参数要求,所以抛出了这个错误。

单个字符的比较根本不需要strcmp,直接用==比较字符本身就行,比如sortChoice == 'n'或者sortChoice == 'N'。

2. 改成char*后为什么会出现输入异常?

当你把sortChoice改成char*后,你声明的是一个未初始化的野指针——它没有指向任何有效的内存空间。这时候用scanf("%c", sortChoice)尝试写入,会直接导致内存访问错误(未定义行为),程序自然无法正常读取输入。

另外,循环执行两次的问题,本质是输入缓冲区的换行符残留:当你输入一个字符并按下回车时,输入缓冲区里会留下两个内容:你输入的字符,以及换行符\n。第一次scanf读取了字符,但\n还留在缓冲区里。下一次循环时,scanf("%c", ...)会直接读取这个\n,导致进入else分支,看起来像是循环多跑了一次。

修复后的完整代码

#include <stdio.h>
#include <ctype.h> // 用于tolower函数

void listBeer(int noRows) {
    int endlessLoop = 1;
    char sortChoice;
    system("cls");
    while(endlessLoop == 1) {
        printf("Do you want to sort by name(n) or by product number(p)?\n");
        // %c前加空格,自动跳过缓冲区里的空白字符(换行、空格等)
        scanf(" %c", &sortChoice);
        printf("kossan hoppade!\n");
        
        // 统一转成小写后比较,简化代码
        char lowerChoice = tolower(sortChoice);
        if(lowerChoice == 'n' || lowerChoice == 'p') {
            endlessLoop = 0;
        } else {
            printf("Please answer with n/N for name sorting or p/P\n");
        }
    }
}

关键修改点说明

  • 保留sortChoice为char类型,用直接的字符比较替代strcmp,并用tolower统一转成小写,减少重复的条件判断。
  • 在scanf的%c前添加一个空格:scanf(" %c", &sortChoice),这个空格会让scanf自动跳过输入缓冲区里的所有空白字符(包括之前残留的换行符),解决循环多执行一次的问题。
  • 如果你不想用tolower,也可以直接写条件:if(sortChoice == 'n' || sortChoice == 'N' || sortChoice == 'p' || sortChoice == 'P'),效果是一样的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:50