2012-04-23 13 views
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(); 
} 
+0

コードをインデントしてください。 SOの推奨は、レベルごとに4つのスペース、タブはありません。 –

+2

また、 'gets'を使わないように教えてください。 –

答えて

2

あなたがそう(「%sの」、のstrcmpなどで印刷する)それらの「文字列」の機能を使って、文字列を0終端じゃない違法です。

この特定のケースでは、repassがスタックレイアウトのために「倍増」されているように見えます。方法はpassrepassです。


サイドノードは、fgets instead of getsを使用します。

+0

+1。実際に起こっているのは、 'pass'にヌルターミネーターがないので、' pass'と 'repass'という2つのスタック変数がひとつの連続した文字列の一部を形成することになります。 –

+0

@CharlesSalviaはい、それはまさに何が起こっているのですか。 – cnicutar

1

ここにはいくつかの問題があります。

  1. getsを使用しないでください。 getは安全ではありません。それを使用する習慣から抜け出す。代わりにscanfを使用してください。
  2. あなたは文字列をNULLで終了していません。文字列の最後には'\0'が必要です。
  3. コードを適切にフォーマットしてください。あなたがそうするなら、それはあなたがロジックに従うのを助けるでしょう。
関連する問題