1

我需要一个函数/方法,它将接收一个 char 数组并将其设置为从标准输入读取的字符串。它需要返回读取的最后一个字符作为其返回类型,因此我可以确定它是否到达了行尾或文件标记的末尾。

这是我到目前为止所拥有的,我有点基于这里的代码

更新:我改变了它,但现在它只是在文本后按回车时崩溃。我知道这种方式效率低下,并且 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;
}

感谢您提前提供任何帮助!

4

3 回答 3

2

您将结果分配给malloc()的本地副本line,因此在getLine()函数返回后它不会被修改(尽管您认为它是)。您要做的就是返回它(而不是使用输出参数)或传递它的地址(通过引用传递它):

void getLine(char **line)
{
    *line = malloc(length);

    // etc.
}

并这样称呼它:

char *line;
getLine(&line);
于 2012-09-29T22:52:51.757 回答
0

您使用的方式realloc不正确。如果它返回NULL,则内存块将丢失。

最好以realloc这种方式使用:

char *tmp;
...
tmp = realloc(line, counter);
if(tmp == NULL)
   ERROR, TRY TO SOLVE IT
line = tmp;
于 2012-09-29T23:00:40.267 回答
0

您的关键问题是指针值不会传播到getLine()函数之外。解决方案是将指向函数的指针的指针作为参数传递,而不是像调用它一样调用它,getLine(&line);而函数将被定义为带参数char **line在函数中,在您现在使用line的所有地方,您将使用*line代替,即取消对指针的引用并使用main()中指针指向的变量的值。希望这不会太混乱。:-) 试着把它画在一张纸上。

(一个棘手的部分 - 您必须更改line[counter]为,(*line)[counter]因为您首先需要取消引用指向字符串的指针,然后才能访问字符串中的特定字符。)

您的代码还有其他几个问题:

  • 您使用char作为charRead的类型。但是,EOF常量不能使用char表示,您需要使用int - 作为charRead的类型和getLine()的返回值,以便您实际上可以区分换行符和文件结尾。
  • 您忘记返回从getLine()函数读取的最后一个字符。:-)
  • 您在每次添加字符后重新分配缓冲区。这不是非常有效,因此是一种相当丑陋的编程实践。使用另一个变量来跟踪分配的空间量并不太难,然后 (i) 从分配合理的内存块开始,例如 64 字节,因此理想情况下您永远不会重新分配 (ii) 只有当您需要基于比较计数器和您的分配大小跟踪器。两种重新分配策略很常见 - 将分配的大小加倍或按固定步长增加分配。
于 2012-09-29T23:02:25.463 回答