0

在下面的代码中,只要在数组“pass”和“repass”中输入相同的字符串,“repass”中的字符串就会加倍。例如,如果 "pass" 和 "repass" 中的输入字符串是 aaaaaaaa,那么 "repass" 中的字符串变成 aaaaaaaaaaaaaaaaa,因为它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();  
}
4

2 回答 2

2

您不是 0 终止您的字符串,因此在它们上使用“字符串”函数(使用“%s”、strcmp 等打印)是非法的。

在这种特殊情况下,由于堆栈布局、方式和彼此相邻,它看起来像是repass“加倍” 。passrepass


侧节点,使用fgets而不是gets.

于 2012-04-23T17:34:39.930 回答
1

这里有一些问题。

  1. 不要使用获取。获取是不安全的。摆脱使用它的习惯。请改用 scanf。
  2. 你不是空终止你的字符串。字符串'\0'最后需要 a 来表示它们已经完成。
  3. 请更好地格式化您的代码。如果你这样做,它将帮助你遵循逻辑。
于 2012-04-23T17:37:43.423 回答