2016-08-12 1 views
1

아래와 같이 sscanf을 사용하여 메모리 포인터에서 short int (16 비트/2 바이트)을 스캔하려고합니다. 그러나 그것은 이상한 행동을 보이고 있습니다.sscanf는 c의 메모리 포인터에서 짧은 int를 스캔하는 동안 -1을 반환합니까?

#include <stdio.h> 
#include <errno.h> 

int main() 
{ 
    unsigned char p[] = {0x00, 0x1A}; 
    short int s = 0; 
    int ret = sscanf(p,"%hu",&s); 
    printf("Actual data %02x %02x\n",p[0],p[1]); 
    printf("s = %hu ret = %d errno = %d\n",s,ret,errno); 
    return 0; 
} 

출력 :

Actual data 00 1a 
s = 0 ret = -1 errno = 0 

내가 뭘 잘못 이해하고 도와주세요!

+1

C에서 malloc 및 친구들의 결과를 캐스팅하는 것은 중복되고 잠재적으로 위험 할 수 있습니다 (http://stackoverflow.com/q/605845/253056). –

+1

디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 성명이없는 질문은 다른 독자에게 유용하지 않습니다. See : 최소한의 완전하고 검증 가능한 예제를 만드는 방법. – Olaf

+2

'p_extradata'는'0x00' 바이트를 가리키고 있으므로 빈 문자열처럼 보이므로'sscanf'가 해석 할 내용이 없습니다. 어쩌면 단지 그 두 바이트를'short'에 그대로 복사하고 C 문자열을'short'로 변환하지 않으려 고합니다. –

답변

2

p0x00 바이트를 가리키고 있으므로 빈 문자열처럼 보이므로 sscanf은 구문 분석 할 수 없습니다. 단지 사본에 두 바이트를 원하는처럼

그것은 그대로에 보이는 당신의 short하는 short에 C 문자열을 변환하지? 그래서 다음 sscanf 전화 대신 그냥 memcpy를 사용할 수있는 경우 :

memcpy(&s, p, sizeof(s)); 

참고이 당신의 버퍼와 대상 short이 같은 엔디안을 가지고 있다고 가정. 그렇지 않으면 바이트 순서를 처리해야합니다.

+1

예. 그것은 효과가 있었다. 감사. –

+0

질문을 편집 할 때 올바른 대답은 memcpy (& s, p, sizeof (s))입니다. –

+0

업데이트 - 향후 원래 질문에 대한 유효한 대답이 있으면 근본적으로 질문을 변경하지 마십시오. –

관련 문제