在C语言中使用scanf读取字符串时为何出现类型错误?
问题解答:scanf读取字符串的类型不匹配警告
核心问题:数组名与数组地址的区别
你编译时的警告,根源是scanf("%s", &operation);这行的参数类型错误:
%s格式符要求传入char*类型指针,指向字符串存储的起始地址。- 而
&operation取的是整个数组的地址,类型为char (*)[6](指向长度为6的char数组的指针),和char*不兼容,因此编译器抛出类型不匹配警告。
你测试的代码能正常运行,是因为直接使用了数组名str——在C语言中,数组名在绝大多数场景下会自动隐式转换为指向数组第一个元素的指针(即char*),完全符合%s的参数要求。
修复方法
把&operation改成operation即可:
scanf("%s", operation);
额外关键细节(你可能忽略的逻辑问题)
不过这里还有个更严重的逻辑漏洞:scanf("%s")会在遇到空格、换行符时停止读取。你需要的是<number> <operand> <number>这种带空格的格式,用%s根本读不到完整表达式(比如输入1 + 4,scanf("%s")只会读取1,剩下的+ 4留在输入缓冲区),导致strlen(operation)永远不等于5,内层循环会一直重复提示错误。
正确的做法是用fgets读取整行输入:
fgets(operation, sizeof(operation), stdin); // 去掉fgets读取到的末尾换行符 size_t len = strlen(operation); if (len > 0 && operation[len-1] == '\n') { operation[len-1] = '\0'; }
另外,你后面用scanf("%c")读取用户选择时,会读取到之前输入残留的换行符,导致程序跳过输入直接进入循环。可以在%c前加一个空格来跳过空白字符:
scanf(" %c", &repeat); // 注意%c前的空格
内容的提问来源于stack exchange,提问作者Tenzin Platter
相关产品推荐
相关产品推荐

