2013-10-16 78 views
1

我有一个功能,调用fgets()stdin作为流,寻找用户输入。但是,在某些情况下,我宁愿让程序决定输入什么,而不是要求用户输入。如果我能找到一种方法来加载stdin缓冲区之前调用函数与fgets()之前的值,这将允许我不改变包含fgets(),同时仍然采取程序输入功能?如果是这样,那么如何加载缓冲区stdin加载stdin缓冲区

+0

你想推送一些字符到'stdin'缓冲区,对吗?包括行尾字符? – Floris

+0

是的。我认为这应该工作。你会怎么做? –

+0

为什么在调用'fgets()'之后不直接连接字符串? – fvdalcin

回答

2

我有一个很棒的技巧,你可能会喜欢尝试:

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char myString[100]; 
    char *hello = "hello world\n"; 
    int ii; 
    for(ii=strlen(hello); ii>=0; ii--) ungetc(hello[ii], stdin); 
    fgets(myString, 99, stdin); 
    printf("I just read '%s'\n", myString); 
    return 0; 
} 

当我编译和运行,我得到:

I just read 'hello world 
' 

注意,newline保持与字符串(这是必要的fgets立即返回) - 所以你需要分开照顾。我不需要单独打回车 - 只需运行程序即可。

我确信您可以根据您的需求进行调整。

+0

值得一提的是,可能成功调用'ungetc()'的次数是有限的:http://pubs.opengroup.org/onlinepubs/9699919799/functions/ungetc.html – alk

+0

@alk - 这是提到,并为链接。不清楚限制是什么 - 我想你需要查看返回值以确认每个字节的成功或失败。这确实让这个解决方案非常脆弱...... – Floris

+0

这个限制有点混乱。上面链接的'ungetc()'页面明确指出_应提供一个字节的推回,但函数的描述否则以复数形式描述推回。 (另外,当我得知这个函数时,我知道它有一个明确的一个字节限制。) –

0

我有一个答案,但它不涉及标准缓冲区。在我编写的一些程序中,我有可选的命令行参数。您可以添加一个命令行标志并在命令行中包含可选输入或作为输入文本文件。如果这个选项适合你,我可以扩展这个答案。

+0

我想到了这一点,但我想看看是否有一种更“巧妙”的方式来做到这一点,可以这么说。 –