当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在scanf中使用整数变量作为索引》经验,为你挑选了1个好方法。

我正在尝试在我的函数中执行以下操作,但不断收到分段错误错误.当我尝试[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
   }
}

Sourav Ghosh.. 5

这里的问题是

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

这里,name_num长度为1 char,这不足以在以后保持一个字符串.所以,当你这样做的时候

scanf("%s", name_num);

你实际上是在写出界限,它会调用未定义的行为.

参考: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任何价值.如果在调用者中使用了返回的值,它将再次调用未定义的行为.



1> Sourav Ghosh..:

这里的问题是

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

这里,name_num长度为1 char,这不足以在以后保持一个字符串.所以,当你这样做的时候

scanf("%s", name_num);

你实际上是在写出界限,它会调用未定义的行为.

参考: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任何价值.如果在调用者中使用了返回的值,它将再次调用未定义的行为.


@SouravGhosh - 谢谢!我忽略了name_num字符长度.这有效.
推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有