我很抱歉,如果这是一个愚蠢的问题,我很抱歉!
我有这个:
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;
没有效果!
答案 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
使用strcpy
或memcpy
代替将question
指向的字符串的内容复制到{{指向的内存的内容中1}}。
答案 4 :(得分:0)
提示: 删除最后一个字符! (提示暗示:你知道长度)