2013-05-18 5 views
1

프로그램을 작성하는 동안 숫자가있는 char 배열의 항목을 채 웁니다. 이렇게하면 0이없는 배열에 대해 계산 된 길이는 정확하지만 0으로 시작하는 배열의 길이는 0입니다!프로그램의 정의되지 않은 동작

왜 이렇게 결과가 나옵니까! 내 실수를 해석 할 수 없습니까?!

int main() 
{ 
    int number_of_terms,no,j,i; 
    char arr[100]; 
    char c; 
    scanf("%d",&number_of_terms); 
    for(i=0;i<number_of_terms;i++) 
    { 
     j=0; 
     while(c!='\n') 
     { 
      scanf("%d",&arr[j]); 
      if(c=getchar()=='\n') 
      break; 
      j++; 
     } 
     printf("Length is:%d\n",strlen(arr)); 
    } 
    return 0; 
} 

for eg if i input my array elements as 4 5 
lenght is 2 
and if my array elements as 0 5 
length is 0.. 
+3

와 'C = getchar가() =='을 찾을 때까지 카운트 업하여 문자열의 길이를 결정하기 때문에 strlen는 그것을 필요 \ n''는 'C = (getchar가 같은지() == '\ n')', 당신은 뻔뻔스럽게도 원하지 않습니다. – Lennart

+0

당신이 무엇이든 그것을 선언 할 때, 그것을 initalizer로주십시오. 떠 다니지 마라. 입력이 실패하여 변수를 이전 상태 (코드 당 결정되지 않음)로 남겨 둡니다. –

답변

2

정수를 생성하는 형식 지정자에 "% d"를 사용하고 문자 배열의 주소를 전달하고 있습니다. 이것은 제목과 마찬가지로 정의되지 않은 동작입니다. 특히 값 0은 문자열의 셀 중 4 개를 차지하며 모든 셀에 0을 씁니다. 값이 0 인 문자가 끝 마커이기 때문에 길이가 0 인 문자열을 얻습니다. 그러나 다른 아키텍처에서는 두 번째 문자로 인해 충돌이 발생할 수 있습니다. ...

정수를 배열에 저장하려면 int arr[...];을 사용해야합니다. 문자를 저장하려면 "% c"를 사용하십시오.

+0

근대 컴파일러가 그걸 잡아 내야 할까? – Cubic

+0

gcc의 최신 버전 (지난 10 년 정도)에 충분한 경고가 설정되어 있으면 잘못된 형식을 사용하고 있음을 알 수 있습니다. 다른 컴파일러는 그렇지 않을 수도 있습니다. –

2

값 0을 배열에 복사하고 있습니다. 문자열을 종료하는 데 사용되는 '\ 0'문자를 처리합니다. 당신이 원하는 것은 문자 '0'을 복사하는 것입니다 (값 48, 아스키 표 참조).

입력을 해석하기 위해 % d을 (를) 십진수 대신 문자로 변경하십시오.

scanf("%c",&arr[j]); 

또한 "arr"의 문자열은 0이 아닙니다. 문자열의 모든 문자 뒤에 값 0 (여기서 십진수는 정확함)으로 문자열을 끝내야합니다. 이 어레이를 통과하고이 0

관련 문제