2013-01-04 4 views
2

나는 포인터와 문자열을 실험하고있다. 다음 코드에서는 모든 것이 테스트되고 (컴파일하고 실행할 수 있음), strcmp를 사용할 때 충돌이 계속됩니다. 코드는 코드 블록에서 경고없이 실행됩니다. 제 실수를 지적 해 주실 수 있습니까?strcmp-crash와 문자열 비교

#include<stdio.h> 
    #include<stdlib.h> 
    #include<string.h> 

    int main() 
    { 
     int choice,x=7,k,q,cmp,j=0,i=0,N; 
     char v[5],str[80],c[5]; 
     char *B[11][2]= 
     {"-----","0", 
     ".----","1", 
     "..---","2", 
     "...--","3", 
     "....-","4", 
     ".....","5", 
     "-....","6", 
     "--...","7", 
     "---..","8", 
     "----.","9", 
     NULL,NULL}; 

     printf("Give a stream"); 
     if(gets(str)) printf("%s\n",str); 
     fflush(stdin); 
     i=0; 
     while(str[i]) 
     { 
      q=0; 
      j=i+1; 
      while(q%5!=0) 
      { 
       v[j]=str[j]; 
       puts(v); 
       j++; 
       q++; 
      } 
      printf("Hello"); 
      for(k=0; k<11; k++) 
      { 
       strcpy(c,B[k][0]); 
       printf("%s",c); 
       x=strcmp(v,c); 
       //Problem: 
       printf("%d",c); 
       if(x==0) printf("hi"); 
      } 
      i=i+1; 
      j++; 
     } 
    } 
+0

'fflush (stdin);'은 정의되지 않은 동작입니다. – chris

+2

이것은 디버거를 사용하는 방법을 배우는 시간처럼 들립니다 ... –

+0

이것은 반드시 문제를 풀지는 않지만 v [6], c [6] 및 v [5] = c [5] = '\ 0 '; 필요합니다. –

답변

1

데이터로 v을 채우지 않습니다. 조건 while(q%5!=0)q == 0부터 입력시 거짓입니다. 이로 인해 v이 초기화되지 않습니다. 즉, 가비지가 포함됩니다.

1

당신은 일을 :

char c[5]; 

B[k][0] 5 개 문자가로 :

strcpy(c,B[k][0]); 

지금 c가 선언됩니다. c을 NUL 종료 문자 배열로 만들려면 NUL char를 수용 할 공간이 있어야합니다. strncpy

+0

C 배열은 0부터 시작합니다. 따라서 0에서 4 사이에 5 개의 문자를 넣은 다음 위치 5에 NULL을 넣습니다. – alex777

+0

@ alex777 : 크기 5의 배열에서 다섯 번째 위치가 없습니다. – codaddict

+0

예 당신 말이 맞아요! 죄송합니다 – alex777

1

src = null 일 때 B [10] [NULL] = NULL.strcpy (char * dest, const char * src)가 덤프되므로 k = 10 일 때이 프로그램이 덤프됩니다.