CS50 edX IDE中运行C代码出现scanf类型不匹配错误求助
问题本质
这不是CS50配套IDE的故障,是代码参数类型和scanf格式要求不匹配触发的编译拦截。你之前写相似代码能正常运行,大概率是之前的代码没有多加那个多余的&,或是当时的编译检查规则没有现在严格,和软件故障没有关系。
CS50 IDE默认开启了最高等级的编译格式检查,把原本仅为警告的类型不匹配问题直接升级为阻断性错误,从根源上避免后续更隐蔽的内存问题。
报错提示的核心逻辑:
scanf中%s格式符要求传入的入参是char *类型(指向字符的指针),你传入的参数类型完全不符合要求:
- 你自己写的版本里:CS50头文件定义的
string本质就是char *类型,写&name相当于取了这个字符指针的地址,最终传入的是char **(二级字符指针),和要求的char *类型完全错位。- 你抄来的数组版本里:
char name[10]是字符数组,数组名作为参数传入时本身就会退化为指向首元素的char *,额外加的&name得到的是“指向整个10长度字符数组的指针”,虽然地址数值和数组首地址碰巧一致,但类型依然不满足%s的检查要求。
修正方案
直接去掉scanf语句里name前面的取地址符号&即可,两个版本的可运行代码如下:
- 使用CS50自定义
string类型的版本:
#include <cs50.h> #include <stdio.h> int main(void) { string name; printf("Name: "); scanf("%s", name); printf("Hello %s\n", name); }
- 使用原生字符数组的版本:
#include <stdio.h> #include <stdlib.h> int main(void) { char name[10]; printf("Name: "); scanf("%s", name); printf("Hello %s\n", name); }
注意:CS50 IDE的严格编译规则是课程故意设置的,目的是帮初学者尽早纠正编码习惯,不需要修改IDE配置就能正常运行修正后的代码。
内容的提问来源于stack exchange,提问作者Adonis
相关产品推荐
相关产品推荐

