C 将字符扫描为整数而不进行转换

C 将字符扫描为整数而不进行转换,c,scanf,C,Scanf,如何使用scanf扫描整数数量的字符,并简单地将它们填充到无符号int中而不进行转换 举个例子,我有以下输入字符(为了便于查看,我将它们放在十六进制中): 我想要前4个字符(因为4个字符适合整数)。以10为基数(十进制)等于221018(大端)。伟大的这就是我想要的int。这似乎像预期的那样工作: scanf("%s", &my_integer); 不知何故,它似乎获得了正确的尾端,将第一个字符放在int的LSB中(为什么?)。但是,正如您所料,这会产生一个编译器警告,因为指针必须指向

如何使用scanf扫描整数数量的字符,并简单地将它们填充到无符号int中而不进行转换

举个例子,我有以下输入字符(为了便于查看,我将它们放在十六进制中):

我想要前4个字符(因为4个字符适合整数)。以10为基数(十进制)等于221018(大端)。伟大的这就是我想要的int。这似乎像预期的那样工作:

scanf("%s", &my_integer);
不知何故,它似乎获得了正确的尾端,将第一个字符放在int的LSB中(为什么?)。但是,正如您所料,这会产生一个编译器警告,因为指针必须指向字符数组(man 3 scanf)

不使用scanf()的另一种方法:

for(int i=0;i<4;i++)
{

my_integer |=(getchar()因此,您希望从stdin读取4个字节,并使用它们作为32位big-endian值的表示:

int my_integer;

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

scanf
printf
处理文本;它们读取(并转换)和写入文本。您需要处理原始的二进制数据。函数
fread
fwrite
是为这种原始数据的I/O而设计的。“真的很简单。”--不,一点也不简单。@M Oehm大体上同意
scanf()而除此之外的文本(“%c”…”将很好地将任何二进制数据读入
char
,只要流
stdin
处于二进制模式。啊!错误的工具用于错误的作业。这可能是有用的:@chux谢谢,更正。我一直在交换参数:-)
for (int i = 0; i < 4; i++)
{
    my_integer |= (getchar() << i * 8);
}
int my_integer;

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