gpt4 book ai didi

c - 如何将标准输入读入字符串变量直到 C 中的 EOF?

转载 作者:太空狗 更新时间:2023-10-29 16:57:41 25 4
gpt4 key购买 nike

我在尝试将 stdin 读入 char* 变量时遇到“总线错误”。我只想读取来自 stdin 的全部内容,并首先将其放入一个变量中,然后继续处理该变量。

我的代码如下:

char* content;
char* c;
while( scanf( "%c", c)) {
strcat( content, c);
}

fprintf( stdout, "Size: %d", strlen( content));

但不知何故,我总是通过调用 cat test.txt | 返回“Bus error”。 myapp,其中myapp是上面的编译代码。

我的问题是如何读取 stdin 直到 EOF 到一个变量中?正如您在代码中看到的,我只想打印来自标准输入的输入大小,在这种情况下,它应该等于文件 test.txt 的大小。

我认为只使用 scanf 就足够了,也许是读取 stdin 的缓冲方式?

最佳答案

首先,您要传递未初始化的指针,这意味着 scanfstrcat 将写入您不拥有的内存。其次,strcat 需要两个以 null 结尾的字符串,而 c 只是一个字符。这将再次导致它读取您不拥有的内存。您不需要 scanf,因为您没有进行任何实际处理。最后,一次读取一个字符是不必要的缓慢。这是解决方案的开始,为最终字符串使用可调整大小的缓冲区,为 fgets 调用使用固定缓冲区

#define BUF_SIZE 1024
char buffer[BUF_SIZE];
size_t contentSize = 1; // includes NULL
/* Preallocate space. We could just allocate one char here,
but that wouldn't be efficient. */
char *content = malloc(sizeof(char) * BUF_SIZE);
if(content == NULL)
{
perror("Failed to allocate content");
exit(1);
}
content[0] = '\0'; // make null-terminated
while(fgets(buffer, BUF_SIZE, stdin))
{
char *old = content;
contentSize += strlen(buffer);
content = realloc(content, contentSize);
if(content == NULL)
{
perror("Failed to reallocate content");
free(old);
exit(2);
}
strcat(content, buffer);
}

if(ferror(stdin))
{
free(content);
perror("Error reading from stdin.");
exit(3);
}

编辑:正如 Wolfer 所暗示的,输入中的 NULL 将导致字符串在使用 fgets 时过早终止。 getline是更好的选择(如果可用),因为它处理内存分配并且不存在 NUL 输入问题。

关于c - 如何将标准输入读入字符串变量直到 C 中的 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496668/

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