帮助自定义getline()函数

时间:2009-01-30 17:07:46

标签: c kr-c

有人可以向我解释为什么这不起作用吗?

#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指针,允许该函数向上移动指针。

8 个答案:

答案 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';

相关问题