c - 为什么此 scanf 语句会导致段错误?

标签 c segmentation-fault scanf

我已经用头撞墙一个小时了,我快疯了……我有一段代码(是的,这是作业)抛出一个段错误,除非我注释掉其中一个我的 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/

相关文章:

c - 将整数读入链表

c - 错误:左值必须作为赋值的左操作数sum = sum + * ptr;

c++ - Android中的Jni层

c - 如何解决段错误(核心转储)?

c - 在 C 的同一行中读取字符串和各种整数

将 sha 256 哈希转换为 c 中的数字

c++ - boost 变体析构函数导致段错误

c++ - 这个段错误的根源是什么?

c++ - getch() 和 scanf() 函数之间的区别

c - 在C中扫描n个没有空格的数字