Tag: stdin

如何在fgets循环中正确刷新stdin

我已经找到了使用while((c = getchar()) != ‘\n’ && c != EOF)清除stdin的示例,并尝试在通过fgets获取输入的循环中使用它。 我需要刷新,因为循环从最后一个输入获取\ n字符并再次运行它。 所以会发生的事情是我现在必须按两次输入。 为什么会发生这种情况,我该如何解决这个问题呢? #define BUFFER_LIMIT 50 do { int c; while ((c = getchar()) != ‘\n’ && c != EOF); printf(“console> “); fgets(input_buffer, BUFFER_LIMIT-1, stdin); if(do_something(input_buffer)) break; } while(strncmp(input_buffer, “quit”, 4) != 0);

在C中预填充stdin

我的程序应该让用户编辑一行文件。 用户编辑该行并按Enter键将其发回。 因此,我想打印即将被编辑的当前行,但是在stdin而不是stdout上打印它。 我不知道如何解决的唯一问题是我如何预先填充标准输入。 我已经试过了: char cprefill[] = {“You may edit this line”}; char cbuffer[100]; fprintf(stdin, cprefill); fgets(cbuffer, 100, stdin); 这似乎是最简单的解决方案,但可能太简单了。 fprintf不会向stdin打印任何内容。 什么是正确的方法? 编辑: 这就是它应该是这样的。 请注意可以移动的光标。

检查stdin是否为空

我搜索但没有得到这个问题的相关答案,我正在使用linux机器,我想检查标准输入流是否包含任何字符,而不从流中删除字符。

什么是“标准输入”?

我的任务是在C中创建一个读取标准输入内容然后打印它们的测试程序。 但我有点怀疑:什么是标准输入 ? 这是我在键盘上键入的内容吗? 这是我必须阅读的文件吗? 他们都? standard output也是如此:它是控制台吗? 一份文件?

C – 替换单词

我的目标是从stdin重定向的文件中读取文本,然后用单词“Replaced”替换某些argv传递的单词。 例如,如果我运行: $ ./a.exe line < input.txt 其中input.txt是“Test line one”,最后我应该打印“Test Replaced one”。 我不太确定我的代码出错了哪里,有时我会出现分段错误,而且我也不确定如何打印newOut字符串,或者我甚至需要一个。 作为旁注,如果我正在使用fgets读取,如果第59个字符开始“li”,那么当它再次开始作为下一个读取命令的第0个索引“ne”时,该怎么办? 难道这不算作strstr搜索的一个字符串吗? 任何帮助表示赞赏,谢谢 #include #include #include int main(int argc, char** argv) { char fileRead[60]; char newOut[]; while (!feof(stdin)){ fgets(fileRead,60,stdin); //read file 60 characters at a time if (strstr(fileRead,argv[1])){ // if argumentv[1] is contained in fileRead strncpy(newOut, fileRead, strlen(argv[1])); // replace } } […]

输入后忽略输入键的C代码

我输入调用后stdin流中的Enter键或字符出现问题。 假设我有一个输入调用,所以我输入了内容。 但是然后将Enter键作为下一个输入调用的输入。 我认为在c ++中有cin.ignore()来做这个伎俩。 我只是找不到C版。 输入方法是getchar()和gets() 。 对不起,如果这是重复的。 我找不到与我相匹配的问题。 谢谢你的帮助! printf(“Do you want to view the lines? “); int choice = getchar(); while (choice == ‘y’) { char line[80]; printf(“What line do you want to see? “); gets(line); if (line != “all”) { n = atoi(line); printf(“Line %d: %s\n”,n,list[n]); } else for (int i […]

在C中停止getline

在这里,我正在尝试使用getline获取用户输入。 收到中断^C我希望它发出getline信号停止并继续使用我的程序而不是终止它。 我试图给stdin写一个换行符,但显然这不起作用。 fwrite(“\n”, 1, 1, stdin); 那么实现这一目标的方法是什么?

为什么不是scanf(“%* \ n”); 和scanf(“%* %* c”); 清除挂线?

调用scanf(“%d”, &variable); 我们留下了一个挂在stdin的换行符,它应该在调用fgets之前清除,或者我们最终将它换成换行符并使其过早返回。 我找到了建议使用scanf(“%*[^\n]%*c”);答案scanf(“%*[^\n]%*c”); 在第一次调用scanf以丢弃换行符后,其他人建议使用scanf(“%*[^\n]\n”); 。 从理论上讲,两者都应该有效:第一个会消耗所有非换行符(但不包括换行符本身),然后只消耗一个字符(换行符)。 第二个将消耗所有非换行符(不包括它),然后\n ,一个空白字符,将指示scanf读取每个空白字符直到第一个非空白字符。 然而,尽管我看起来这些方法在某些答案中起作用,但我无法让它们在这里工作(下面的代码)。 为什么scanf方法都scanf ? 测试:Ubuntu Linux – gcc 5.4.0 scanf(“%*[^\n]\n”); 做法: #include int main(int argc, char **argv){ int number; char buffer[1024]; printf(“Write number: \n”); scanf(“%d”, &number); //Clearing stdin? scanf(“%*[^\n]\n”); printf(“Write phrase: \n”); fgets(buffer, 1024, stdin); printf(“\n\nYou wrote:%u and \”%s\”\n”, number, buffer); return 0; } 输出: $ ./bug […]

如何在C中检查stdin是否为空

我(重新)学习C编程,所以下面的问题是为了理解。 使用scanf()我学会了(或者我自己发现,实际上并不需要很长时间才能达到这一点),冲洗stdin是一件好事。 我进一步发现(在你的帮助下)fflush(stdin)不是标准的事情,例如与gcc不兼容。 我继续使用下面的代码片段来刷新stdin。 它在这里提供(谢谢)。 如果stdin不为空,它工作正常。 然而,如果stdin是空的,它就不起作用。 我的刷新函数中的fgetc()只是等待并阻止程序。 事实上,到目前为止我所知道的所有其他stdin读取函数(scanf(),fgetc(),gets(),fgets(),getchar())都表现出相同的行为。 所以我的刷新函数实际上是一个条件刷新:它只在缓冲区不为空时才刷新。 如果它为空,则刷新阻塞程序并等待stdin的输入。 这不是我想要的。 所以,我需要的是检查stdin是否为空的方法。 如果是我继续。 如果不是我运行我的冲洗function。 所以,我正在寻找的是一种检查标准输入是否为空的C标准方法。 非常感谢您的帮助! void flush_line(FILE *); /* function to flush stdin in a C standard way since*/ /* fflush(stdin) has undefined behaviour. */ /* s. http://stackoverflow.com/questions/20081062/fflushstdin-does-not-work-compiled-with-gcc-in-cygwin-but-does-compiled-with-v */ void flush_line(FILE *fin) { int ch; do { ch = fgetc(fin); } while (ch […]

如何检查我的程序是否有数据传输到其中

我正在编写一个应该通过stdin读取输入的程序,所以我有以下结构。 FILE *fp=stdin; 但是如果用户没有将任何东西输入到程序中,这只会挂起,我如何检查用户是否实际将数据传输到我的程序中 gunzip -c file.gz |./a.out #should work ./a.out #should exit program with nice msg. 谢谢