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

标签 c stdin

我在尝试将 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/

相关文章:

vbscript - 有什么方法可以检测 STDIN 是否已在 VBscript 中重定向?

c - 如何将单个字符数字(如 '5')转换为整数

c - Ncurses C 程序在 xwindows 的终端中自行启动

c - 将进程的标准输出重定向到多个管道

curl - 通过 cURL 从 stdin 上传数据作为具有特定名称的文件

perl - 为什么 STDIN 会导致我的 Perl 程序卡住?

c++ - MP3 帧头检测 FFF/FFE 同步问题

c - 如何使用Tensorflow的C api从TF_Operation获取TF_Input?

c - int_fast_ 类型和值溢出

C - While 循环复制打印语句