C循环打印字符串两次? (使用scanf(“%c”))

时间:2012-02-23 21:50:25

标签: c scanf

很抱歉这可能是一个愚蠢的问题,但我想练习一下循环并提出这个想法。基本上它要求你进入或不进入循环,当你进入时,它会要求你做点什么做问题是,在我进入循环后,它会打印两次printf字符串,然后传递给scanf并等待输入。我无法弄清楚。 欢迎大家帮忙!这是代码:

#include <stdio.h>

int main() 
{
    char check = 'a';
    char int_check = 'a';
    int b = 0;
    printf("want to go in? [y or n]\n");
    scanf("%c",&check);
    if ( check == 'y') {
        while (1){
            printf("Waiting: \n");
            scanf("%c",&int_check);
            if ( int_check == 'q'){
                printf("You're out, bye!\n");
                break;
            };
        };
    } else if ( check == 'n'){
        printf("You're not in, see ya!\n");
    }else {
        printf("Please, type 'y' or 'n'\n");
    };
    return 0;
}

2 个答案:

答案 0 :(得分:4)

如果您在终端上输入以下内容:

x

第一个循环会看到x

第二个循环将看到一个换行符。

解决此问题的最简单方法是使用sscanf和getline。

答案 1 :(得分:2)

可以更改程序以立即响应键盘,即无需等待用户按回车键。它需要改变输入终端​​的属性,并且通常比面向行的输入更麻烦且更不便携。 This page描述了如何执行此操作,以下是修改后的代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>

struct termios saved_settings;

void
reset_term_mode(void)
{
  tcsetattr (STDIN_FILENO, TCSANOW, &saved_settings);
}

int main() 
{
    tcgetattr(STDIN_FILENO, &saved_settings);
    atexit(reset_term_mode);

    struct termios term_settings;

    tcgetattr(STDIN_FILENO, &term_settings);
    term_settings.c_lflag &= ~(ICANON|ECHO);
    term_settings.c_cc[VMIN] = 1;
    term_settings.c_cc[VTIME] = 0;
    tcsetattr(STDIN_FILENO, TCSAFLUSH, &term_settings);

    char check = 'a';
    char int_check = 'a';
    int b = 0;
    printf("want to go in? [y or n]\n");
    scanf("%c",&check);
    if ( check == 'y') {
        while (1){
            printf("Waiting: \n");
            scanf("%c", &int_check);
            if ( int_check == 'q'){
                printf("You're out, bye!\n");
                break;
            };
        };
    } else if ( check == 'n'){
        printf("You're not in, see ya!\n");
    }else {
        printf("Please, type 'y' or 'n'\n");
    };
    return 0;
}