gpt4 book ai didi

c - 帮助自定义 getline() 函数

转载 作者:行者123 更新时间:2023-12-02 06:12:35 29 4
gpt4 key购买 nike

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

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

最佳答案

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

line = malloc(sizeof(char));

在你的 printf 语句之前用 \0 填充。

我猜您想将此行更改为:

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

关于c - 帮助自定义 getline() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/496330/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com