我正在尝试在我的函数中执行以下操作,但不断收到分段错误错误.当我尝试[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
任何价值.如果在调用者中使用了返回的值,它将再次调用未定义的行为.
这里的问题是
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
任何价值.如果在调用者中使用了返回的值,它将再次调用未定义的行为.