我已经用头撞墙一个小时了,我快疯了……我有一段代码(是的,这是作业)抛出一个段错误,除非我注释掉其中一个我的 scanf 语句。我曾尝试使用 gdb 调试问题,但直到今天我才真正了解到任何相关内容。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * creditCard(char * ccNumber){
char * lastFour;
lastFour = (ccNumber + strlen(ccNumber) - 4);
return lastFour;
}
void zipCode(int zip){
printf("The zip code entered is: %d\n", zip);
}
int fuelGrade(int grade){
}
int main(void){
char * ccNumber = NULL;
int zip = 0;
int gasGrade = 0;
printf("Please Enter Credit Card Number: ");
scanf("%s", ccNumber);
printf("Please Enter Your Billing Zip Code: ");
scanf("%d", &zip);
printf("Select your Fuel Grade.\n Unleaded(1) Plus(2) Premium(3): ");
scanf("%d", &gasGrade);
ccNumber = creditCard(ccNumber);
printf("****-****-****-%s\n", ccNumber);
zipCode(zip);
return 0;
}
当我按原样编译并运行时,我得到以下信息:
Please Enter Credit Card Number: 123413515
Please Enter Your Billing Zip Code: Select your Fuel Grade.
Unleaded(1) Plus(2) Premium(3): 1
Segmentation fault
输入邮政编码被跳过,我在输入燃料等级的任何内容后立即出现段错误。但是,如果我注释掉 scanf("%d", &gasGrade); 行,代码运行正常。
最初我没有初始化变量,我的代码组织也有点不同,但我似乎找不到解决这个问题的正确方法。 我在这里做错了什么?
感谢您的帮助!
最佳答案
因为通过做 scanf("%s", ccNumber);
与 ccNumber = NULL
你正在取消引用 NULL
指针。
"%s"
scanf()
的说明符需要一个指向有效内存的指针,它可以在其中写入扫描数据,您传递的是 NULL
指针,它不检查指针是否为 NULL
,因此它取消引用了 NULL
指针。
你需要有效的内存,所以你可以在这种情况下使用堆栈,就像这样
char buffer[100];
char *ccNumber;
if (scanf("%99s", buffer) != 1)
problemScanning_buffer_DoNotUse_buffer_In_TheFollowingCode();
ccNumber = creaditCard(buffer);
注意 99
上面,它防止溢出 buffer
,并且您必须始终检查 scanf()
的返回值以防止未定义的行为。
关于c - 为什么此 scanf 语句会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29502319/