【问题标题】:Assigning new value to a string - C为字符串分配新值 - C
【发布时间】:2012-04-03 13:28:16
【问题描述】:

尝试在命令行中从用户那里获取几个文件名并将它们存储到链接列表中,但我收到了分段错误。这个想法是让用户输入每个文件名,然后在完成后输入“q”。

我输入第一个文件名“man_on_moon.txt”,没有出现错误。在我输入第二个之后,“sat_moons_rings.txt”我得到.. Segmentation fault: 11 我相信它发生在我对 char *name 的分配中,但我不确定。

char *name = malloc(sizeof(char) *50);
scanf("%s", name);
list *curr, *head;
curr = malloc(sizeof(list));
head = malloc(sizeof(head));
if(name != "q")
{
    curr->item = name;
    head->next = curr;
    curr = curr->next;
    scanf("%s", name);
}
while(name != "q")
{
    curr->item = name;
    curr = curr->next;
    scanf("%s", name);
}

【问题讨论】:

  • 您只分配了一个字符串。每次scanf("%s", name)都会覆盖相同的字符串数据。
  • 这行有点可疑:“head = malloc(sizeof(head));”可能只是一个错字,但headcurr 是相同类型的指针,但它们被分配了不同大小的块。 .

标签: c string char variable-assignment


【解决方案1】:

你应该限制 scanf 字符串,这样它就不会溢出你的缓冲区:

scanf("%49s", Name);

然后,要比较循环的结尾,您需要检查字符 - 而不是字符串比较:

if (name[0] != 'q') 

..

最后,您还需要将您的姓名复制到您的列表中。

【讨论】:

  • 你不应该使用if(name[0] != 'q'),因为它会破坏任何以'q'开头的字符串以及字符串“q”
  • 哦,是的,当然。写的太快了。它应该有一个 strlen(name) == 1 添加,或者只是你提到的 strcmp()。
【解决方案2】:

您从未将curr->next 设置为任何东西,因此它指向NULL,然后您将curr 设置为curr->next。因此,当您进入访问 curr->item 的 while 循环时,您正在尝试获取 NULL 的字段并且您会遇到段错误。

这背后的原因是您只为 2 个节点分配空间。您创建的每个节点都有 malloc 空间。

【讨论】:

  • 太好了,我已经为每个发生的 curr->next 分配了内存,并且程序接受多个文件名。谢谢你。但是,当我在命令行中输入 q 时,它不会退出 while 循环。建议?
  • 不要使用!= 使用strcmp(name, "q") != 0
猜你喜欢
  • 2019-07-18
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
相关资源
最近更新 更多