【问题标题】:Convert hex scanned (scanf) from an unsigned int array into decimal将扫描的十六进制 (scanf) 从无符号整数数组转换为十进制
【发布时间】:2012-02-20 11:23:12
【问题描述】:

我在这里尝试将 4 位 hexa 转换为 dec 但没有成功。 这是我的代码。

unsigned int array[4];                         

printf("Type in 4-digit hexa: \n");

scanf("%x", &array);

while(getchar() != '\n');

printf("Your number in dec is %u \n", array);

我不知道它有什么问题,但它不会给出正确的 dec 输出。 就像我输入 EEFF 时,它应该给出 61183,但程序一直打印出 65518。

这个号码是从哪里来的?我的代码有什么问题?根据我的考虑,我使用了 unsigned int FFFF 等于 65385,unsigned int 的范围是 0 到 65535。数据的范围应该没有问题,我也使用了 %u。

在我进行了一些搜索之后,我现在唯一能想到的就是这个问题可能与 unsigned int 到 int 或 sth 的大小有关。 我看了解释,但不太明白。

我知道,这可能是重复的,但我在这里要求更简单的解释 为什么这不起作用。老实说,我对这个网站和编程都是一个新手,所以请对我进行轻松的编码。仅供参考,我真的不知道 stdio.h 之外的任何内容。

【问题讨论】:

  • 我尝试使用建议的代码“unwind”,效果很好。谢谢你,放松,还有所有进来帮助我的人!
  • FYI cplusplus.com - 这个网站有很多例子,可以帮助你理解 c/c++ 的美妙之处......
  • 感谢您的推荐。我一定会深入研究的。 :D

标签: c hex unsigned-integer


【解决方案1】:

您将指针array 传递给printf()。这里不需要数组,您要扫描和打印的只是一个数字。

unsigned int number;

printf("Type in 4-digit hex:\n");

if (scanf("%x", &number) == 1)
  printf("Your number in dec is %u \n", number);

另请注意,通过检查返回值来检查scanf() 是否成功是一个好主意。

【讨论】:

  • 非常感谢您的回答。但是,根据您的回答,为什么“if (scanf("%x", &number) == 1)”?
  • 关于检查 scanf() 是否成功,我已经逐步跟踪程序,但它没有显示任何线索供我检查。我的输出窗口只有一个弹出窗口,要我输入输入(4 位十六进制),它立即向我显示了结果。我在 32 位 Windows 操作系统上使用 TC 编译器。
  • 线索是scanf的返回值。它是成功转换的格式说明符的数量。猜猜为什么这与 1 相比?
  • 根据我的拙劣猜测,是否与1表示正确,0表示错误有关?
  • 好吧,你有一个格式说明符 (%x),你有一个返回值 1,这是成功转换的预期值。如果某些转换失败,则数字小于格式说明符。例如。在 scanf("%x %d %u %i",&a,&b,&c,&d) 中,您希望 scanf 返回 4。如果它返回任何其他值,则表示失败。您必须阅读 scanf 的文档才能获得启发。乍一看可能很吓人,但它会让你走得更远。
【解决方案2】:

你不需要一个数组:

unsigned int val;
printf("Type in 4-digit hexa: \n");
scanf("%x", &val);
printf("Your number in dec is %u \n", val);

【讨论】:

  • 也非常感谢您的回答。另一个问题,如果可以的话,你什么时候需要一个数组?我认为在这种情况下我需要一个数组,因为输入是 4 位,所以我设置了一个 4 的数组。
【解决方案3】:

一个。打印array[0],而不是array

(可选) b.扫描到array,而不是&array

c。 getchar() 的意义何在?

【讨论】:

  • 为什么是数组[0],而不是数组?关于 getchar(),我这样做只是为了安全,它不会扫描和存储“\n”的值。
  • 一个。 arrayunsigned int 的数组。你想打印这个数组开头的unsigned int。因此,array[0]。 C。不要做那样的事情。 scanf 足够聪明,可以进行检查。 (实际上,由于您执行 getchar after scanf,它甚至无法正常工作。
  • 哦,谢谢!除了跟踪程序之外,我应该如何检查 getchar() 是否正常工作,因为我这样做了,但对我没有多大帮助。
  • 关于 scanf() 足够聪明,可以检查,没有冒犯,因为这可能只是因为我的编码能力差,但是有一个案例我有 scanf() 我的第一个 int 然后使用 printf( ) 将其打印出来并对我的第二个 int 执行相同的操作。结果出现错误,因为它存储了先前输入的“\n”值。老实说,我真的不知道什么时候 while(getchar() != '\n');工作或什至对其余代码没有影响,但我只是为了安全起见^^“
  • scanf("%d",...) 搜索数字,不存储任何其他内容。
【解决方案4】:

不,您必须以字符串形式输入一个字符点。之后,您转换为数字。 例

char *str=char[10];
int i=0,num=0;
printf("Type in 4-digit hexa: ");
scanf("%s",str);

for(i=0;str[i]!='\0';i++)
   if(str[i]>='0' && str[i]<='9') num=16*num+str[i]-'0';
   else if(str[i]>='a' && str[i]<='f') num=16*num+str[i]-'a';
   else if(str[i]>='A' && str[i]<='F') num=16*num+str[i]-'A';

printf("Dec is %d",num);

【讨论】:

  • 非常感谢您的帮助,但请原谅我不理解您在 for 循环中的 if-else 条件。你介意解释一下吗?
  • 为什么不让scanf 做文本到数字的转换呢?此外,您的转换代码非常难看,并且非常需要一些大括号。 char *str=char[10] 是什么?
猜你喜欢
  • 1970-01-01
  • 2014-04-16
  • 2010-10-16
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多