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

