我在尝试弄清楚如何使用时遇到了很多问题scanf().它似乎与整数一致,相当直接scanf("%d", &i).
我遇到问题的地方是scanf()在循环中尝试读取输入.例如:
do {
printf("counter: %d: ", counter);
scanf("%c %c%d", &command, &prefix, &input);
} while (command != 'q');
Run Code Online (Sandbox Code Playgroud)
当我输入一个有效的结构化输入时c P101,它似乎再次循环,然后提示我.即使只有一个,这似乎也会发生:
scanf("%c", &c)
Run Code Online (Sandbox Code Playgroud)
在一个循环中.在再次提示我之前,它会进行两次循环.是什么让它循环两次,我该如何阻止它?
当我输入较少量的输入时,以编程方式不会有其他字符或数字,例如q,按Enter似乎提示我输入更多.如何scanf()处理单字符和双字符条目?
scanf当Enter按下键时,似乎开始扫描输入,我想用下面的代码验证这一点(为简单起见,我省略了错误检查和处理).
#include <stdio.h>
int main(int argc, char **argv) {
/* disable buffering */
setvbuf(stdin, NULL, _IONBF, 0);
int number;
scanf("%d", &number);
printf("number: %d\n", number);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是另一个问题,在我禁用输入缓冲之后(只是为了验证结果;我知道我应该在实际中做到这一点,以防它干扰结果),输出是(注意额外的提示):
$ ./ionbf
12(space)(enter)
number: 12
$
$
Run Code Online (Sandbox Code Playgroud)
这与输入缓冲启用时的输出不同(无额外提示):
$ ./iofbf
12(space)(enter)
number: 12
$
Run Code Online (Sandbox Code Playgroud)
在启用缓冲区时,似乎会消耗新的行字符.我在两台不同的机器上进行了测试,一台安装了gcc 4.1.2和bash 3.2.25,另一台安装了gcc 4.4.4和bash 4.1.5,结果两者相同.
问题是:
scanf开始扫描用户输入?角色进入的那一刻?或者它是否缓冲直到一条线完成?我使用 switch case 语句编写了一个程序并要求输入一个字符,但它没有要求在控制台窗口中输入字符而是完全跳过它
int main()
{
float a, b, ans;
char opr;
printf("\nGIVE THE VALUES OF THE TWO NUMBERS\n");
scanf(" %f %f",&a,&b);
printf("\nGIVE THE REQUIRED OPERATOR\n");
//no display(echo) on the screen
//opr = getch();
//displays on the screen
//opr = getche();
scanf("%c",&opr);
switch(opr)
{
case '+' :
ans = a+b;
printf("%f", ans);
break;
case '-' :
ans = a-b;
printf("%f", ans);
break;
case '*' :
ans = a*b;
printf("%f", ans);
break;
case '/' :
ans = a/b;
printf("%f", ans); …Run Code Online (Sandbox Code Playgroud)