Can';t从开关、can';正确调用函数;我记不起一个函数

Can';t从开关、can';正确调用函数;我记不起一个函数,c,function,switch-statement,C,Function,Switch Statement,我的代码有一些问题。首先,当我想从switch语句调用函数时,它不会工作。我的意思是函数正在调用,但是fgets和stdin不工作。如果我在main中单独调用同一个函数,那么所有函数都可以正常工作。另一个问题是,当我想调用else语句中的相同函数时。我只想在密码(或昵称)错误时调用函数一次,但它会调用几次,通常是随机调用 void passcheck(){ char password[11]; int up,num; puts("Password (max 10 si

我的代码有一些问题。首先,当我想从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;
}
void passcheck(){
字符密码[11];
整数,num;
puts(“密码(最多10个符号,必须包含大写字母和数字):”;
fgets(密码,10,标准输入);
对于(int i=0;i<10;i++){
if(isupper(密码[i])){
up=1;
}
if(isdigit(密码[i])){
num=1;
}
}
如果(num==1&&up==1){
printf(“您的密码很好,看起来像:\n%s\n”,password);
}
否则{
放入(“更正您的密码”);
密码检查();
}
}
无效昵称(){
查尔尼克[11];
整数,num;
puts(“键入您的昵称(必须包含大写字母):”;
fgets(nick,10岁,stdin);
对于(int i=0;i<10;i++){
if(isupper(nick[i])){
up=1;
}
}
如果(num==1){
printf(“您的昵称很好,它是:\n%s\n”,nick);
}
否则{
放置(“正确的昵称”);
昵称();
}
}
作废你要做的事(){
整数;
puts(“您想做什么?\n 1.检查密码\n 2.检查昵称”);
scanf(“%d”和编号);
开关(编号){
案例1:
密码检查();
打破
案例2:
昵称();
打破
违约:
放置(“错误符号!”);
打破
}
}
int main(){
做什么;
//密码检查();
返回0;
}

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

您的代码不需要一个新行字符,并将其解释为输入的一部分,从而导致所解释的副作用

每次读取标准输入时,必须使用或删除新行字符。这里详细解释了发生这种情况的原因以及您可以采取哪些措施来避免这种情况:


您键入什么?void What to do()应为void What to do(void),其他函数以及当程序提示您时您在提示中输入的内容,以及您随后看到的内容?
fgets(密码,10,标准输入)-->
fgets(密码,11,标准输入)
int up,num-->
int up=0,num=0
,在
昵称处
如果(num==1){
-->
如果(up==1){
scanf(“%d”、&number);
scanf(“%d%*c”、&number);
scanf(“%d”、&number);而(getchar()!=“\n”)
另外:每当您需要调试代码时,最好将要处理的输入转储。如果您在阅读密码后将这一行添加到代码中:
printf(“输入:'%s',密码”);
然后您会立即看到新行字符被添加到您的输入提要中。^^^正如@racs所说。这称为调试。如果您无法调试,则无法为计算机编程。