在期望整数输入时处理“非数字字符”

时间:2013-12-07 15:23:58

标签: c char integer scanf

我需要一个以下函数的帮助,它需要一个整数输入;当我插入类似“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;
}

2 个答案:

答案 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,因为它非常简单)。

一旦您获取了一行输入,请使用任何方法解析它(确保在尾随垃圾上发生错误):getlinesscanfstrtok_r,..