# make test
cc test.c -o test
# ./test
I am a happy yam until i hit return...
# ./test
because it ends my [BLEEPING] program....
# ./test
OOOH how my blood doth burn !!! ...doth? ...doest? ...meh...
# cat test.c
#include "usual_suspects.h"
int main()
{
int i;
scanf( "%d", &i);
}
# echo 'So, how do I continue onto the next line
> without terminating the program? Not a wrapping function but,surviving
> hitting the enter key?
不是Dornishman的妻子,但嘿,我的预算低,半脑筋。的xD 扫描是写入的方式(看看我在那里做了什么)与它一起去?
UPDATE-根据答案a la hexturtle
# make test
cc test.c -o test
# ./test
Well blow me down, a cross-eyed clown !
Said a can of yams imported from Spain.
If i had a bucket to spit,
I'd sorely say frak-it and quit !
Whilst watching my brine wash away
with the rain. xD
^C
# YES !!!!!!!!!
bash: YES: command not found
# cat test.c
#include "usual_suspects.h"
int main()
{
int i;
while (true) {
scanf("&d", &i);
}
}
最终修改,承诺= D 好的,这就像我想的那样小。
#include "usual_suspects.h"
int main()
{
while (true) {
scanf("%d");
}
}
答案 0 :(得分:1)
当您致电scanf()
时,程序将阻止,等待控制台输入。因此,一旦您按Enter键,您输入的输入将被读入,scanf()
将返回。一旦scanf()
返回,您的程序将继续执行。在您给出的示例中,scanf()
返回后没有更多代码可以执行。因此,main()
函数隐式返回0并导致程序退出。
如果您想继续阅读输入行,可以执行以下操作:
while (true) {
scanf("%d", &i);
}
在实践中,有更好的方法可以做到这一点,正如Elliot Frisch所说。但原则上,这是我认为你正在尝试做的事情。
答案 1 :(得分:1)
fread()
功能可以满足您的需求。它将读取指定的字节数或直到达到EOF,然后在unix上用CTRL + D输入到键盘。
#include <stdio.h>
#include <unistd.h>
#define MAX_STR_LEN 500
int main()
{
// Declare a char array to read into
char str[MAX_STR_LEN + 1];
// Read into the char array until MAX_STR_LEN bytes
// have been read or EOF
fread(str, 1, MAX_STR_LEN, stdin);
// Null Terminate and print what we read in
str[MAX_STR_LEN] = '\0';
printf("%s", str);
fflush(stdout);
}
这个缺点是你没有得到花哨的scanf
格式说明符。你必须自己处理大的结果串。
但要意识到这一点:在后台,fread()
正在进行多个read()
系统调用,这些调用在每个换行符后返回。因此,我认为从单行中获得的任何东西都可以获得新的成就。
在实践中,我已经找到了最佳解决方案,并且可以阅读过去的换行符&#34;是逐行读取文件。这可以通过下面更优雅的代码来完成,如果你真的需要连接的结果字符串,只需在字符串上使用strcat()
。
while (EOF != scanf("%s", &str)) {
// Do something
}
但上面的代码可以满足您的要求。