无法从开关正常调用功能,无法调用功能

时间:2016-05-17 23:26:46

标签: c function switch-statement

我的代码有些问题。首先,当我想从switch语句中调用一个函数时,它不会工作。我的意思是函数正在调用,但fgets和stdin不起作用。如果我在main中单独调用相同的函数,则一切正常。而另一个问题是,当我想在else语句中回忆相同的函数时。我想在密码(或昵称)错误时召回一次这个函数,但它会召回几次,通常很随机。

void passcheck(){

    char password[11];
    int up,num;

    puts("Password (max 10 signs, must contain upperletter and number):");
    fgets(password, 10, stdin);

    for(int i = 0; i < 10; i++){
        if (isupper(password[i])) {
            up=1;
        }
        if (isdigit(password[i])){
            num=1;
        }
    }
    if (num == 1 && up == 1){
        printf("Your password is good and looks like:\n%s\n", password);
    }
    else{
        puts("Correct you password");
        passcheck();
    }
}

void nickname(){

    char nick[11];
    int up,num;

    puts("Type your nickname (must contain upperletter):");
    fgets(nick, 10, stdin);

    for(int i = 0; i < 10; i++){
        if (isupper(nick[i])) {
            up=1;
        }
    }
    if (num == 1){
        printf("Your nickname is good and it is:\n%s\n", nick);
    }
    else{
        puts("Correct nickname");
        nickname();
    }
}


void what_to_do(){
    int number;
    puts("What do you want to do?\n 1. Check password \n 2. Check nickname");

    scanf("%d", &number);
    switch (number) {
        case 1:
            passcheck();
            break;
        case 2:
            nickname();
            break;
        default:
            puts("Wrong sign!");
            break;
    }
}
int main(){

    what_to_do();

    //passcheck();

    return 0;
}

1 个答案:

答案 0 :(得分:0)

所有问题都与输入处理在标准输入中的工作方式有关:它是作为字符流处理的,而只有当您按下输入键时才会从终端发送数据,这会添加一个新行字符流。

您的代码不期望换行符,并将其解释为输入的一部分,从而导致解释的副作用。

每次从标准输入读取时,必须使用或删除换行符。这里解释了为什么会发生这种情况,你可以做些什么来完全避免它:

http://www.gidnetwork.com/b-60.html