我需要一个以下函数的帮助,它需要一个整数输入;当我插入类似“F”(非数字字符)的东西时,程序卡住了,它没有显示任何输出或让我插入更多输入。 怎么能解决这个问题?
int input_legality(int game_board[FIELD_ROWS][FIELD_COLS])
{
int input=0;
while(1)
{
if(scanf("%d", &input)==1)
{
if(input==DOWN || input==LEFT || input==RIGHT || input==UP)
{
return input;
}
else
if(input==EXIT)
{
printf("\n program exited by user \n");
return 1;
}
else
if(input==PRINT)
{
printField(game_board);
continue;
}
else
{
fprintf(stderr,"your step is undefined, please try another one\n");
continue;
}
}
}
return 0;
}
答案 0 :(得分:0)
似乎" F"如果scanf()不读取整数,则保留在stdin中。 一个答案是如果未检测到整数则扫描字符串...
尝试添加类似
的内容char bla[256];
scanf("%s",bla);
在while循环结束时(或者在scanf("%d)失败的情况下)
这是一个基本的"主要"代码:
#include <stdio.h>
#define DOWN 0
#define UP 1
#define LEFT 2
#define RIGHT 3
#define EXIT 4
#define PRINT 5
int input_legality()
{
int input=0;
while(1)
{
if(scanf("%d", &input)==1)
{
if(input==DOWN || input==LEFT || input==RIGHT || input==UP)
{
return input;
}
else{
if(input==EXIT)
{
printf("\n program exited by user \n");
return 1;
}
else{
if(input==PRINT)
{
printf("ble %d \n",input);
continue;
}
else
{
fprintf(stderr,"your step is undefined, please try another one\n");
continue;
}
}
}
}
//while(getchar() != EOF);
//fflush(stdin);
char bla[256];
scanf("%s", bla);
}
return 0;
}
int main ( int argc , char * argv [] )
{
int i;
for(i=0;i<42;i++){
input_legality();
}
return 0;
}
这种scanf很简单:其他一些可能更好。 使用switch-case可以澄清代码。 再见,
弗朗西斯
答案 1 :(得分:0)
始终,始终始终获取(交互式)一次输入一行。那就是用户如何构思它,所以程序逻辑应该是相似的。
POSIX <Router navigationBarStyle={styles.navBar} titleStyle={styles.navTitle} sceneStyle={styles.routerScene}>
<Schema .../>
<Route .../>
</Router>
const styles = StyleSheet.create({
navBar: {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'red', // changing navbar color
},
navTitle: {
color: 'white', // changing navbar title color
},
routerScene: {
paddingTop: Navigator.NavigationBar.Styles.General.NavBarHeight, // some navbar padding to avoid content overlap
},
})
功能非常有用。或者,您可以使用getline
并自己处理超长行(可能实现fgets
,因为它非常简单)。
一旦您获取了一行输入,请使用任何方法解析它(确保在尾随垃圾上发生错误):getline
,sscanf
,strtok_r
,..