很抱歉这可能是一个愚蠢的问题,但我想练习一下循环并提出这个想法。基本上它要求你进入或不进入循环,当你进入时,它会要求你做点什么做问题是,在我进入循环后,它会打印两次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;
}
答案 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;
}