2010-08-30 74 views
2

我正在用C编写一个简单的应用程序。我正在Unix环境中工作。C - printf和scanf - 如何终止输入?

我的应用程序正在做一些简单的I/O。我使用printf来提示用户输入一些内容,然后使用scanf来获取输入。

问题是,我不知道如何告诉我的应用程序,我准备在输入值后继续。键入'输入'提供了换行符'\ n',这是有道理的。 Control-d确实允许scanf捕获我的输入,但似乎忽略了任何后续的scanf指令。

有人可以帮我吗?

printf("Enter name\n"); 
scanf("%s",input); 
printf("%s",input); 

printf("enter more junk\n") 
scanf("%s",morestuff); /* cntrl+d skips this*/ 
+0

进入不仅增加了一个 '\ n',但也刷新缓冲区。 IO一直等到缓冲区已满或手动刷新为止。 – 2010-08-30 03:33:00

回答

4

检查返回值从scanf()。一旦获得EOF(由于您键入了control-D),每次都会失败,直到您清除错误。

请谨慎使用scanf();我发现在真实世界中使用它非常困难,因为它不能控制我认为需要的错误处理。我建议使用fgets()或相当于读取数据行,然后使用sscanf() - 一个更文明的函数 - 来解析数据。

另请参阅松散相关的问题:SO 3591642

+0

完美。谢谢..问题是scanf中的换行符。我会研究你提到的其他功能。 – Nick 2010-08-30 03:56:05

+1

当乔纳森说“谨慎使用scanf()”的时候,乔纳森会变得慈善。我宁愿用“避免它像瘟疫一样”:-) scanf(无字段宽度限制的%s格式)的天真使用是一个等待发生的缓冲区溢出错误。 – 2010-08-30 04:08:29

-1

[编辑:这个答案是不正确,因为我下面所说,我正在学习以及]

你试过CTRL-Z?

将EOF发送到scanf,根据它的手册页,它应该使scanf移动到下一个字段。由于您只输入了一个字符串作为输入格式,因此应该终止scanf。

我现在不能测试这个,但你可以试试看。

手册页是在这里:

http://www.slac.stanford.edu/comp/unix/package/rtems/doc/html/libc/libc.info.scanf.html

+3

在Unix上从终端发送EOF的正常默认值是Control-D;在DOS上,它是Control-Z。当然,您可以将Unix设置为使用“stty eof^Z”来模拟DOS。但是,更通常的情况是,Control-Z用于暂停当前(前台)进程并让您使用shell进行操作。 – 2010-08-30 03:28:06

+1

谢谢,总是乐于学习新东西(或者在这种情况下,重新学习一些东西)。 – babbitt 2010-08-30 03:38:54