c的自定义getLine()函数

时间:2012-09-29 22:48:43

标签: c string getline

我需要一个函数/方法,它将接受一个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;
}

提前感谢您的帮助!

3 个答案:

答案 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 需要取消引用指向该字符串的指针,并且只有然后访问字符串中的特定字符。)

您的代码还有其他一些问题:

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