1

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

我有这个:

  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;

没有效果!

4

5 回答 5

5

要摆脱换行符,在您的 malloc 之前,请执行以下操作:

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

另一种选择(在下面的评论中建议)将改为执行以下操作:

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

将 malloc 行更改为:

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

更改分配行:

memq = question;

至:

strcpy (memq, question);
于 2010-12-14T17:45:55.843 回答
2

这段代码被严重破坏了。

如果您打算将数据复制到那里,则需要分配strlen+1字节memq(为什么要这样做sizeof?因为sizeof(strlen())is将分配 4 个字节sizeof(int))。

您不能只分配questionmemq期望数据被复制进来。所有这些都会覆盖您刚刚malloc-ed into的指针memq,从而泄漏它。你所要做的

strcpy(memq, question);

这就是为什么你需要额外的字节 in memq,因为这包括一个空终止符。此时,您可以memq按照其他地方所述删除换行符。

于 2010-12-14T17:48:03.063 回答
1

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

使用strcpyor代替,将指向的字符串的内容memcpy复制到指向的内存的内容中。questionmemq

于 2010-12-14T17:48:26.313 回答
1

假设您的输入是 ABCDEn,其中 n 代表新行。

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

因此,通过删除最后一个字符,您将删除 null,而不是换行符。我会像你一样取下最后一个字符,然后将(新)最后一个字符设置为 null 以终止你的字符串。

于 2010-12-14T17:47:34.093 回答
0

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

于 2010-12-14T17:50:12.910 回答