2

谁能向我解释为什么这不起作用?

#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()to分配的原始地址*line,然后将该指针传递给printf(),允许函数向上遍历指针。

4

8 回答 8

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;
}
于 2009-01-30T17:11:45.973 回答
3

看起来您正在打印一个长度为零的字符串。

*line = '\0';
printf("%s", line);

我假设您想存储line最初的内容(从 返回的内容malloc)并打印出来。

于 2009-01-30T17:10:42.153 回答
1

您似乎只为一个角色分配了足够的空间。您的意思是不是以下内容:

line = malloc(lim * sizeof(char));

此外,您不想line在阅读每个字符后进行更改。将以下块用于您的 while 循环:

*(line + i) = c;
i++;

最后,要对字符串进行空终止,请使用:

*(line + i) = '\0';
于 2009-01-30T17:12:07.847 回答
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)
于 2009-01-30T17:20:20.920 回答
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)
}
于 2009-01-30T17:25:31.250 回答
0

你也在覆盖你不拥有的内存。您正在 malloc'ing 一个字符,将 *line 设置为 c,然后增加 line 并重复。

于 2009-01-30T17:12:57.283 回答
0

您需要了解指针的概念,以及它与缓冲区的不同之处。在您的代码中,您将“行”同时视为指针和缓冲区。

于 2009-01-30T17:21:55.550 回答
0

你在两点上犯了错误(但你可以说同样的错误或两个,这取决于你)。首先你的指针应该像

*(行+i) = c; 由于这个原因,当您在循环结束时设置 Null 字符时,您实际上是在说编译器仅将指针指向该位置。因此,指针仅指向 Null 字符串而不是整个字符串。因为它在循环的每个步骤中不断移动。因此,当您尝试打印时,指针没有可打印的内容。因此,如果您更改指针循环内的语句并将值分配给一个明确的地址,而不是实际移动指针,那么您的问题将得到解决。

笔记。如果更改该行,则还需要像这样修改 Null 终止符分配;*(行+限制) = '\0';

于 2009-01-30T17:30:46.577 回答