2012-09-09 2 views
2

그래서 scanf 부분을 주석 처리하고 (그리고 내 자신의 문자열로 초기화했습니다.) scanf를 사용하면 왜 충돌이 발생합니까? 나는 scanf()에 넣은 실제 인자를 믿는다; 맞습니다. 당신이 버퍼에 scanf() 포인터를 보내는 것을scanf ("% s", ptr)에 대한 포인터를 전달할 수 없습니다.

#include <stdio.h> 
#include <stdlib.h> 
int strendmilan(char *s,char *t) 
{ 
    int scntr = 0,tcntr = 0; 
    while(*(s+(scntr++)) != '\0') 
     ; 
    --scntr; 
    while(*(t+(tcntr++)) != '\0') 
     ; 
    --tcntr; 
    while(tcntr >= 0) 
     if(*(s+scntr--) == *(t+tcntr--)) 
      ; 
     else 
      return 0; 
    return 1; 
} 
int main() 
{ 
    char *s,*t; 
    /* 
    scanf("%s",s); 
    scanf("%s",t); 
    */ 
    s = "HAHAHACOOL"; 
    t = "COOL"; 
    if(strendmilan(s,t) == 0) 
     printf("NOT"); 
    else 
     printf("YES"); 
    getch(); 
} 
+3

'scanf '를 호출하기 전에 일부 메모리를's'에 할당하십시오. – cnicutar

답변

7

문제는 (예, s)가 저장할 수있는 정보는, 를 읽을 수 있지만 당신이 할당되지 않은있는 버퍼 공간은 s가 가리키는 (그리고) t에 대한 동일한

char *s,*t; 
scanf("%s",s); 

그래서 당신은 s에 대한 문자의 배열을 할당, 또는 스토리지를 할당하고 s 해당 호출의 반환 값을 할당 malloc()를 사용 할 수 있습니다.

+0

하지만 s = "HAHAHACOOL"; \t t = "차갑다"; 비록 내가 배치 한 공간이 없어도 작동합니다. – latenightcode

+0

@vincentbelkin은 내가 게시 한 것을 전혀 바꾸지 않습니다. 'scanf'는 데이터를 저장할 수있는 위치에 대한 포인터를 원합니다. 포인터를 생성 한 다음,'s'가 가리키는 저장소를 할당하지 않고 (그리고'scanf'가 성공적으로 사용하기 위해서)'scanf' *를 즉시 호출합니다. – Levon

+2

@vincentbelkin,'t = "COOL"'은 문자열 리터럴을 저장하기 위해 암시 적으로 메모리를 할당 한 다음, 그 메모리의 위치를 ​​포인터 변수에 할당합니다. 'scanf'는 포인터 변수가 이미 할당 된 메모리를 가리 키기를 기대하며, 거기에 문자를 읽어들입니다. –

관련 문제