2013-03-29 2 views
-1
main() 
{ 
    char a[20]; 
    int b; 
    printf("\n enter your name"); 
    a[20]=getchar(); 
    printf("\n enter your password"); 
    scanf("%d",&b); 
    if (a=="ilangeeran") 
    { 
     printf("\n login successful"); 
    } 
} 

이 스택을 컴파일 할 때 샘플 프로그램입니다. 스매싱 오류가 발생하여이 오류를 해결하는 방법이 있습니까?아래의 코드를 컴파일 할 때 발생하는 스택 스매싱 오류를 해결하는 방법은 무엇입니까?

+3

이 코드에는 여러 가지 잘못된 점이 있습니다. 솔직히 말하면 쉽습니다. * 이와 같이 코딩하지 마십시오. (1)'main()'에 대한 묵시적인 리턴 타입. (2)'main()'에서 리턴 값 *이 없습니다. (3) 부적절한 어레이 "비교". 내가 제시하는 싱글 바이트 스택 오버런을 수정하기 전에 * 모든 코드를 컴파일하는 코드를 얻는 것이 더 중요 할 것이다. – WhozCraig

+0

우선 bounds를 통해 배열을 수행합니다 [20] = getchar(). 또한 문자열을 잘못 비교하는 경우 strcmp (a, "ilangeeran")를 사용하여 문자열을 비교해야합니다. – user2181624

+0

의도적으로'a [20] = getchar();을 사용하여 정의되지 않은 동작을 호출하지 않아도됩니다. –

답변

5

의 선언은 20 문자의 배열을 지정합니다 : a[0]부터 까지입니다. a[20]이 범위를 벗어났습니다 : a[20]=getchar();.

getcharint을 반환합니다. 문자가 아닌 문자 EOF을 유효한 문자 값과 구별하기 위해 이렇게합니다. 모든 양의 반환 값은 문자입니다. 어떤 음의 값은 오류입니다 ...하지만 에 반환 값을 저장하려면 int오류를 처리하기 위해 음수 값이 인 int를 확인하십시오!

int c = getchar(); 
if (c < 0) { 
    fputs("Read error while reading from stdin", stderr); 
    return EXIT_FAILURE; 
} 
a[19] = c; /* Don't rely on this being a string, since a string is a sequence of 
      * characters ending at the first '\0' and this doesn't have a '\0'. 
      * Hence, it isn't a string. Don't pass it to any str* functions! */ 

마찬가지로, 당신은 아마는 scanf에서 오류를 처리해야합니다 말도

switch (scanf("%d", &b)) { 
    case 1: /* excellent! 1 means that one variable was successfully assigned a value. */ 
      break; 
    case 0: fputs("Unexpected input while reading from stdin; " 
        "The \"%d\" format specifier corresponds to decimal digits.", stderr); 
      return EXIT_FAILURE; 
    default: fputs("Read error while reading from stdin", stderr); 
      return EXIT_FAILURE; 
} 

if (a=="ilangeeran")입니다. 어느 책을 읽고 있니?

관련 문제