在scanf中使用整数变量作为索引

时间:2016-01-04 15:15:24

标签: c arrays scanf

我尝试在我的功能中执行以下操作但仍然遇到分段错误错误。当我尝试使用[iModify - 1]作为我的索引时,它失败了。

你能不能将int变量计算用作C?

中的索引
int modify(pb *PhoneBook)
{
   int x;
   int iModify = 0;
   char name_num[] = {'\0'};
   print(PhoneBook);
   printf("\nWhich entry would you like to modify? ");
   scanf("%d", &iModify);
   printf("\niModify - 1: %d\n", iModify - 1);

   printf("\nModify name or number? ");
   scanf("%s", name_num);
   convert_u(name_num);
   if (strcmp(name_num, "NAME") == 0) {
      printf("\nEnter new name: ");
      scanf("%s %s", PhoneBook[iModify - 1].cFirstName, PhoneBook[iModify - 1].cLastName); //fails here
   }
   else if (strcmp(name_num, "NUMBER") == 0) {
      printf("\nEnter new number: ");
      scanf("%s", PhoneBook[iModify - 1].cNumber); //also fails here
   }
}

2 个答案:

答案 0 :(得分:5)

这里的问题是

 char name_num[] = {'\0'};

此处,name_num的长度为1 char,这不足以在以后持有字符串。所以,当你做的时候

scanf("%s", name_num);

你实际上是在写出界限,调用undefined behavior

参考:C11,章节§6.7.9

  

如果初始化未知大小的数组,则其大小由索引最大的数组决定   具有显式初始化程序的元素。 [...]

要与您的代码进行比较,name_num是一个未知大小的数组,仅由括号括起初始值设定项中的单个元素初始化,因此数组的大小将为1.

解决方案:您必须在定义时明确提及大小。你需要像

这样的东西
char name_num[32] = {'\0'};     //32 is just for example purpose
....
scanf("%31s", name_num);  // make sure longer inputs don't blow up the buffer

或类似。

话虽如此,请注意您的int modify()函数 return任何值。如果在调用者中使用了返回的值,它将再次调用undefined behavior

答案 1 :(得分:0)

您在代码中使用了char name_num[] = {'\0'};name_num的长度为1 char,此时间太短,无法在以后保留字符串。

因此,当您阅读name_num时,您正在写出越界。