在下面的代码中,每当在数组“pass”和“repass”中输入相同的字符串时,“repass”中的字符串将加倍。例如,如果“pass”和“repass”中的输入字符串是aaaaaaaa,那么“repass”中的字符串将变为aaaaaaaaaaaa,因为strcmp()给出了否定的答案。
有人能帮忙解释一下背后的原因吗?

#include<stdio.h>
#include<conio.h>
#include<string.h>

void main()
{
    char user_name[20],pass[8],repass[8];
    int i=0,c=0,tr=1;//tr for no of try(should less than 3 )
    clrscr();
    puts("enter user name");
    gets(user_name);
    printf("\n\n\n\n");

    for(tr=1;tr<=3;tr++)
    {
        puts("\n\nenter password");

        while(i<8)
        {
            pass[i] = getch();
            putchar('*');
            i++;
        }

        printf("\n\n\n\nplease reenter the password\n\n");
        i=0;

        while(i<8)
        {
            repass[i]=getch();
            putchar('*');
            i++;
        }

        c=strcmp(pass, repass);
        printf("c=%d", c);

        if(strcmp(pass,repass)==0)
            c=0;
        else
            c++;

        if(c==0)
        {
            printf("\n\n\t****\vsuccessful login*********** ");
            break;
        }
        else
            printf("\n\nsorry password did not match");
    }

    if(tr>3)
        puts("\n\nlogin failed");
    //printf("%s        %s",pass,repass);
    getch();
}

最佳答案

您不是0-终止字符串,因此对它们使用“string”函数(使用%s、strcmp等打印)是非法的。
在这种特殊情况下,由于堆栈布局,repasspass的方式是一个接一个的,因此它看起来像是“加倍的”。
侧节点,使用repass instead of fgets

关于c - 为什么打印输入缓冲区会导致意外输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10285307/

10-12 00:13