以下代码是问题部分:
#define NICKLEN 10
...
typedef char * string;
typedef struct donation
{
string nickname;
...
} Item;
...
void eatline(void)
{
while (getchar()!='\n');
}
...
string s_gets(string st, int n)
{
string ret_val;
string find;
ret_val=fgets(st, n, stdin);
if (ret_val)
{
find=strchr(st, '\n');
if (find)
*find='\0';
else
eatline();
}
return ret_val;
}
...
int main(void)
{
Item donate;
...
puts("Enter y to start");
while(getchar()=='y')
{
eatline(); // to remove \n from input
puts("Enter nickname. Limit is 10 characters.");
s_gets(donate.nickname, NICKLEN);
...
以下是输入,输出
Enter y to start
y
Enter nickname. Limit is 10 characters.
ffff
当我输入昵称时,会发生错误(在gdb中):
iogetline.c: No such file or directory.
最佳答案
您的nickname
或struct donation
中的成员Item
是char
指针。因此,donate.nickname
是未初始化的指针。它可能指向任何地方,因为它具有垃圾值。
该指针中的值被视为存储位置的地址,该地址甚至可能不是允许程序访问的存储器的一部分。
非法访问内存时,您的程序段错误。
使用fgets()
中的s_gets()
,您将写入donate.nickname
指向的存储位置。
您可以将struct donation
设置为
typedef struct donation
{
char nickname[11];
...
} Item;
因为用
nickname
存储的字符串的最大大小为10。额外的一个字符用于\0
字符。fgets()
也会读入尾随的\n
。如果您也想存储它,我想您必须将大小修改为12。或者,如果要动态分配内存,请在
Item donate;
之后添加以下行donate.nickname = malloc(sizeof(char)*11);
使用完后释放内存
free(donate.nickname);
关于c - 出现段错误:iogetline.c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49209113/