当前位置:  开发笔记 > 编程语言 > 正文

帮助自定义getline()函数

如何解决《帮助自定义getline()函数》经验,为你挑选了1个好方法。

任何人都可以向我解释为什么这不起作用?

#include 
#include 

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然后将该指针传入的temprorary指针printf(),允许该函数向上走指针.



1> Sean Bright..:

因为您只为此行中的单个字符分配了足够的空间:

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 
#include 

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;
}

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有