相关疑难解决方法(0)

使用C中的scanf解析输入

我在尝试弄清楚如何使用时遇到了很多问题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)
  1. 当我输入一个有效的结构化输入时c P101,它似乎再次循环,然后提示我.即使只有一个,这似乎也会发生:

    scanf("%c", &c) 
    
    Run Code Online (Sandbox Code Playgroud)

    在一个循环中.在再次提示我之前,它会进行两次循环.是什么让它循环两次,我该如何阻止它?

  2. 当我输入较少量的输入时,以编程方式不会有其他字符或数字,例如q,按Enter似乎提示我输入更多.如何scanf()处理单字符和双字符条目?

c scanf

10
推荐指数
1
解决办法
1万
查看次数

scanf何时开始和停止扫描?

scanfEnter按下键时,似乎开始扫描输入,我想用下面的代码验证这一点(为简单起见,我省略了错误检查和处理).

#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,结果两者相同.

问题是:

  1. 如何在启用和禁用输入缓冲时解释不同的行为?
  2. 回到原来的问题,什么时候scanf开始扫描用户输入?角色进入的那一刻?或者它是否缓冲直到一条线完成?

c io buffer scanf

7
推荐指数
1
解决办法
2578
查看次数

Scanf 不扫描 %c 字符而是跳过该语句,这是为什么?

我使用 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)

c scanf char dev-c++ switch-statement

2
推荐指数
1
解决办法
4478
查看次数

标签 统计

c ×3

scanf ×3

buffer ×1

char ×1

dev-c++ ×1

io ×1

switch-statement ×1