我需要一个函数/方法,它将接受一个char数组并将其设置为从stdin读取的字符串。它需要返回读取的最后一个字符作为其返回类型,因此我可以确定它是否到达行尾或文件结束标记。
这是我到目前为止所做的,我基于here
的代码更新:我改变了它,但现在它只是在文本后按下输入时崩溃。我知道这种方式效率低下,而且char不是最好的EOF检查,但是现在我只是想让它返回字符串。我需要它以这种方式做到而没有其他时尚。我需要字符串是行的确切长度,并返回一个值为换行符或EOF int,我相信仍然可以在char值中使用。
该程序使用C而不是C ++
char getLine(char **line);
int main(int argc, char *argv[])
{
char *line;
char returnVal = 0;
returnVal = getLine(&line);
printf("%s", line);
free(line);
system("pause");
return 0;
}
char getLine(char **line) {
unsigned int lengthAdder = 1, counter = 0, size = 0;
char charRead = 0;
*line = malloc(lengthAdder);
while((charRead = getc(stdin)) != EOF && charRead != '\n')
{
*line[counter++] = charRead;
*line = realloc(*line, counter);
}
*line[counter] = '\0';
return charRead;
}
提前感谢您的帮助!
答案 0 :(得分:2)
您将malloc()
的结果分配给line
的本地副本,因此在getLine()
函数返回后,它不会被修改(尽管您认为是这样)。你需要做的是返回它(而不是使用输出参数)或传递它的地址(通过引用'传递'):
void getLine(char **line)
{
*line = malloc(length);
// etc.
}
并将其称为:
char *line;
getLine(&line);
答案 1 :(得分:0)
您使用realloc
的方式不正确。如果它返回NULL
,则内存块将丢失。
最好以这种方式使用realloc
:
char *tmp;
...
tmp = realloc(line, counter);
if(tmp == NULL)
ERROR, TRY TO SOLVE IT
line = tmp;
答案 2 :(得分:0)
您的关键问题是 行 指针值不会传播出 getLine()函数。解决方法是将指向行指针的指针作为参数传递给函数 - 将其称为getLine(&line);
,同时将函数定义为参数{ {1}}。在函数中,在您现在使用 line 的所有地方,您将使用 * line ,即取消引用指向指针并使用指针的值。指针所在的 main()中的变量。希望这不会太混乱。 :-)尝试在一张纸上画出来。
(一个棘手的部分 - 您必须将char **line
更改为line[counter]
,因为 first 需要取消引用指向该字符串的指针,并且只有然后访问字符串中的特定字符。)
您的代码还有其他一些问题: