2014-01-20 65 views
0

我正在学习C语言,有些东西我无法弄清楚sscanf。打印到缓冲区时,没有任何数据正在写入,并且它们始终以-1失败。如果你看到第二个printf语句,我可以在屏幕上清晰地查看我的数据,所以我知道它是正确的,但由于某种原因,指针没有任何内容。sscanf写入不正确

这是我的代码片段。

char *v = (char*)&int_value; 
int i; 
for(i=0;i<sizeof(unsigned int);i++) 
{ 
    printf("sscanf success: %d ", sscanf(&v[i], "%02x", &buffer[pos+i])); 
    printf("%02x\n", v[i]); 
} 

谢谢,我只是按字节做字节现在buffer[pos+i] = v[i];

+0

'buffer'是如何定义的?还有'&v [i]'似乎在做错误的事情,它会在'i'位置访问'v'的指针,然后把指针指向那个位置,为什么? – nrathaus

+2

函数'sscanf'需要一个实际的字符串作为第一个参数。 – cnicutar

+0

'buffer'是一个char *。但是如果我确实使用'sscanf(“0f”,“%02x”,&buffer [pos + i])这样的实际字符串,那么它会写得很好。我应该使用什么函数呢? – enigma99a

回答

0

你假设int值在某种程度上转换由类型转换为ASCII,但它不是这样的sscanf的将失败。 sscanf需要有效的C字符串才能在例如char* p = "02";但是当你输入int时,你会得到数字的实际字节表示 - 例如,在中间可能会有一个0来终止字符串。

E.g.如果你的int值是8,它会在内存中看起来像这样:00 00 10 00(或者十六进制的00h 08h - 它的外观取决于你的体系结构)。

+0

我正在尝试做十进制小端到十六进制并保存到缓冲区。我最好怎么做到这一点? – enigma99a

+0

你已经按照一定的顺序用你的printf输出了十六进制值,你的操作系统是小的还是大的?如果它是在小端,那么它只是一个字节复制到缓冲区的问题。如果不是的话,你可以使用联合'typedef union {unsigned int n; unsigned char b [4]; } uu'然后只是交换字节 –

+0

是的,它可以工作,但我不知道如何获取数据到缓冲区。感谢您的帮助,也是操作系统是小endian – enigma99a