c删除新行char帮助

时间:2010-12-14 17:43:16

标签: c newline fgets

我很抱歉,如果这是一个愚蠢的问题,我很抱歉!

我有这个:

  fgets(question,200,stdin);
  char *memq = malloc(sizeof(strlen(question)));
  memq= question;

然而问题变量总是在它的末尾有一个新行! 我如何删除/防止它发生?

我试过这个:

  fgets(question,200,stdin);
  char *memq = malloc(sizeof(strlen(question))-sizeof(char));
  memq= question;

没有效果!

5 个答案:

答案 0 :(得分:5)

在你的malloc之前删除换行符:

question[strlen(question)-1] = 0;

替代方案(在下面的评论中建议)将改为:

question[strcspn(question, "\n")] = '\0';

将malloc行更改为:

char *memq = malloc(strlen(question)+1);

更改分配行:

memq = question;

为:

strcpy (memq, question);

答案 1 :(得分:2)

此代码严重破坏。

如果您计划将数据复制到strlen+1,则需要将memq个字节分配到sizeof(为什么要进行sizeof(strlen())?这将分配4个字节,因为sizeof(int)question)。

您不能只将memq分配给malloc并期望复制数据。所有这一切都会覆盖您memq的指针 - 编入strcpy(memq, question); ,泄漏它。你必须这样做

memq

这就是为什么你需要memq中的额外字节,因为这包括一个空终止符。此时,您可以从{{1}}移除换行符,如其他地方所述。

答案 2 :(得分:1)

假设你的输入是ABCDEn,其中n表示新行。

你将在ABCDEn0中读取,其中0表示null,它终止字符串。

所以,通过取下最后一个字符,你将取消空值,而不是换行符。我会像你一样取下最后一个字符,但是然后将(new)last char设置为null以终止你的字符串。

答案 3 :(得分:1)

在这两种情况下,memq = question 错误。您刚刚丢失了指向新分配的新空间的指针,而是将question的第一个字符的地址复制到memq

使用strcpymemcpy代替将question指向的字符串的内容复制到{{指向的内存的内容中1}}。

答案 4 :(得分:0)

提示: 删除最后一个字符! (提示暗示:你知道长度)