2012-04-23 4 views
0

다음 코드에서 동일한 문자열이 "pass"및 "repass"배열에 입력 될 때마다 "repass"의 문자열이 두 배로됩니다. 예를 들어 "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'는 하나의 인접한 문자열의 일부를 형성하게됩니다. –

+0

@CharlesSalvia 예, 그렇습니다. – cnicutar

1

여기 몇 가지 문제가 있습니다.

  1. gets를 사용하지 마십시오. 가져 오기가 안전하지 않습니다. 그것을 사용하는 습관을 버려라. 대신 scanf를 사용하십시오.
  2. 문자열을 널 종료하지 않습니다. 문자열의 끝에는 '\0'이 필요합니다.
  3. 코드를 더 형식을 지정하십시오. 그렇게하면 논리를 따라갈 수 있습니다.
관련 문제