有人可以向我解释为什么这不起作用吗?
#include <stdio.h>
#include <stdlib.h>
char *getline(int lim)
{
char c;
int i;
char *line;
line = malloc(sizeof(char) * lim);
i = 0;
while((c = getchar()) != '\n' && c != EOF && i < lim-1)
{
*line = c;
line++;
i++;
}
*line = '\0';
printf("%s", line);
return line;
}
我现在并不担心返回值 - 只是printf("%s", line)
无效的原因。
谢谢!
编辑已修复为line = malloc(sizeof(char) * lim);
,但仍无效。
解决方案: *line
的地址在整个功能中递增。当它传递给printf()
时,*line
指向'\ 0',因为这是其地址递增的位置。使用存储由malloc()
分配给*line
的原始地址然后将该指针传递到printf()
的temprorary指针,允许该函数向上移动指针。
答案 0 :(得分:5)
因为你只为这一行中的单个字符分配足够的空间:
line = malloc(sizeof(char));
在你的\0
陈述之前,printf
已经充满了这一点。
我猜你要把这一行改为:
/* Allocate enough room for 'lim' - 1 characters and a trailing \0 */
line = malloc(sizeof(char) * lim);
甚至更好:
char *line, *tmp;
tmp = line = malloc(sizeof(char) * lim);
然后在所有指针数学中使用tmp
,这样line
仍将指向字符串的开头。
我知道这是您开发的早期阶段,但您需要确保free()
malloc()
内存#include <stdio.h>
#include <stdlib.h>
char *getline(int lim)
{
char c;
int i;
char *line, *tmp;
tmp = line = malloc(sizeof(char) * lim);
i = 0;
/* NOTE: 'i' is completely redundant as you can use 'tmp',
* 'line,' and 'lim' to determine if you are going to
* overflow your buffer */
while((c = getchar()) != '\n' && c != EOF && i < lim-1)
{
*tmp = c;
tmp++;
i++;
}
*tmp = '\0';
printf("%s", line);
return line;
}
。
以下是您的功能的工作版本,包括我建议的更改:
{{1}}
答案 1 :(得分:3)
看起来你正在打印一个零长度的字符串。
*line = '\0';
printf("%s", line);
我假设您要存储line
最初的内容(从malloc
返回)并打印出来。
答案 2 :(得分:1)
您似乎只为一个角色分配了足够的空间。你的意思是:
line = malloc(lim * sizeof(char));
此外,您不希望在阅读每个字符后更改line
。请改用while循环使用以下块:
*(line + i) = c;
i++;
最后,要终止字符串,请使用:
*(line + i) = '\0';
答案 3 :(得分:1)
更新 - 这是一个简单的拼写错误,但您没有必要对我投票
而不是
char *line= malloc(sizeof(char));
尝试
int space= //number of how many characters you need on the line
char *line= malloc(sizeof(char)*space);
抱歉,我的意思是
char *line= malloc( sizeof(char)*lim)
答案 4 :(得分:1)
每个人都已经涵盖了这些要点,但这里有一切都放在一起:
编辑:稍微改进了代码
#include <stdio.h>
#include <stdlib.h>
char *getline(int lim)
{
char *result = malloc(sizeof(char) * lim); // allocate result buffer
int i = 0;
char c;
char *line = result;
while((c = getchar()) != '\n' && c != EOF && i < lim-1)
{
*line = c;
line++;
i++;
}
*line = '\0';
printf("%s", result); // print the result
return result; // return the result buffer (remember to free() it later)
}
答案 5 :(得分:0)
你也在覆盖你不拥有的记忆。你是malloc'ing一个字符,将*行设置为c,然后递增行并重复。
答案 6 :(得分:0)
您需要了解指针的概念,以及它与缓冲区的不同之处。 在你的代码中,你同时将“line”视为指针和缓冲区。
答案 7 :(得分:0)
你在两点上犯了错误(但你可以说同一个错误或两个错误,它取决于你)。首先你的指针应该像
一样递增*(line + i)= c; 由于这个原因,当你在循环结束时设置Null char时,你实际上是在说编译器将指针指向只有这个poistion.Hence指针只指向Null String而不是整个字符串。因为它在循环的每一步中不断被移动。 因此,当您尝试打印时,指针无法打印。因此,如果你在循环中更改你的语句指针并将值分配给一个快速地址,而不是实际移动指针,那么你的问题就会得到解决。
请注意。如果你更改那一行,那么你还需要像这样修改你的Null终结符赋值; *(行+限制)='\ 0';