以下代码是问题部分:

#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.

最佳答案

您的nicknamestruct donation中的成员Itemchar指针。因此,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/

10-10 17:51