2017-09-20 2 views
0

이것은 내가 시도한 것으로, 내 논리는 tmp 왼쪽으로 31 번 이동하면 사용자 입력 정수 I과 비교되고 1 또는 0 값이 색인에 삽입됩니다. str[0] ->str[31]이고, 널 종료 str[32]\0입니다.정수를 이진수로 변환하는 코드

그러나 세그먼트 오류가 발생합니다.

P. 이 함수의 매개 변수를 변경할 수 없으며 교수님은 str의 크기를 주 메뉴에서 33으로 설정 했으므로 변경할 수 없습니다.

void int2bitstr(int I, char *str) { 
     int tmp = 1 << 31; 
     do{ 
       *str++ = !!(tmp & I) + '0'; 
     } while(tmp >>= 1); 
     *str = '\0'; 
} 
+3

'int'가 서명되어 있습니다. 그것에 대해 잊어 버린 적이 있습니까? –

+0

나는 항상 [Valgrind] (https://www.valgrind.org)를 사용하여 segfaults를 이해합니다 –

+1

유진 (Eugene)이 말한 것을 기반으로,'tmp'의 값을 콘솔에 출력하면 출력에 놀랄 것 같아요. 각 반복, 특히 루프 종료 절을 고려해야합니다. – WhozCraig

답변

1

unsigned inttmp을보십시오. 음수 (부호있는) 정수를 오른쪽 시프 팅하는 동작은 구현에 따라 정의되며,이 경우 루프가 길이가 str을 초과하도록 1s (원래의 MSB)로 시프트 될 가능성이 큽니다.

+1

'int tmp = 1 << 31;' -->'unsigned tmp = 1u << 31; (반드시 1u로 변경하십시오) – chux

+0

고마워요! 프로그램은 지금 잘 작동합니다, 나는 이것을 잊어 버릴 수 없습니다. –

관련 문제