0

次のコードでは、配列「pass」と「repass」に同じ文字列が入力されるたびに、「repass」の文字列が 2 倍になります。たとえば、「pass」と「repass」の入力文字列が aaaaaaaa の場合、「repass」の文字列は aaaaaaaaaaaaaaaa になるため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. 取得を使用しないでください。Gets は安全ではありません。それを使用する習慣から抜け出してください。代わりに scanf を使用してください。
  2. 文字列をヌルで終了していません。'\0'文字列は、完了したことを示すために末尾にa が必要です。
  3. コードをより適切にフォーマットしてください。そうすれば、ロジックに従うのに役立ちます。
于 2012-04-23T17:37:43.423 に答える