2014-09-25 5 views
1

어떻게 scanf를 사용하여 정수 문자로 스캔하고 변환없이 부호없는 정수로 채울 수 있습니까? scanf 문자를 변환하지 않고 int로 변환

나는 다음과 같은 입력 문자 (I 가시성에 대한 진수에 넣어 한) 한 예를 보자
5A 5F 03 00 FF FF 3D 2A 

내가 원하는 처음 4 (때문에 INT 4 문자의 적합)를. 기본 10 (십진수)에서 이것은 221018 (빅 엔디안)과 같습니다. 큰! 그것이 내 int에서 원하는 것입니다. 이 예상대로 작동하는 것 같다 :
scanf("%s", &my_integer); 

은 어떻게 든 LSB INT의에서 첫 번째 문자를 배치 엔디안 권리를 얻을 것 (왜?). 그러나 포인터가 문자 배열 (man 3 scanf)이어야하므로 컴파일러 경고를 생성합니다.

는 scanf() 사용하지 않고 다른 방법 : 읽을 수있는 문자를 지정하는 포인터 타입을 사용하는 것이 내가 여기에 어떤 변환을 수행하지 않으려는

for (int i = 0; i < 4; i++) 
{ 
    my_integer |= (getchar() << i * 8); 
} 

주, 나는 간단한 소원을. & my_integer가 길면 똑같은데, 8 문자를 읽고 저장합니다.

정말 간단합니다.

scanf의 사용에 대한 제 생각은 정확하지 않으며 더 나은 접근 방법이 있어야합니다. 어떻게 할 수 있습니까?

N.B. 유형 크기가 아키텍처에 따라 다르다는 것을 알고 있습니다.

+2

'scanf'와'텍스트에 printf' 일; 그들은 텍스트를 읽고 변환합니다. 원시 이진 데이터로 작업하려고합니다. 'fread'와'fwrite' 함수는 이러한 원시 데이터의 I/O를 위해 설계되었습니다. –

+0

"단순함." - 아니, 전혀. :) – unwind

+0

@M Oehm 일반적으로 'scanf()와 그 이외의 텍스트'scanf ("% c"...)는'stdin' 스트림이있는 한 모든 바이너리 데이터를'char'로 멋지게 읽을 것입니다. 바이너리 모드입니다. – chux

답변

2

그래서 당신은 그들이 32 비트 빅 엔디안 값의 표현으로 그대로을 표준 입력에서 4 바이트를 읽고 사용할 :

int my_integer; 

if (fread (&my_integer, sizeof my_integer, 1, stdin) != 1) { 
    /* Some problem... */ 
} 
+0

@chux 감사합니다. 나는 args를 계속 교환한다 :-) – Jens

관련 문제