C中是否有任何setbase()等效项?如何在c中将基数设置为dec,十六进制或oct?

时间:2018-09-19 08:10:16

标签: c

long int id;
printf("Enter Aircraft Id: (eg abeb11");
scanf("%x",&id);

id"必须读取为十六进制值。 但我收到警告format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘long int’ [-Wformat=]

在C ++中,我们可以使用setbase()。 但是我对如何在C中做到这一点感到困惑。

3 个答案:

答案 0 :(得分:3)

您可以使用%lx格式说明符来读取长十六进制值。

scanf希望读入变量的地址。

scanf("%x",id);,这将导致未定义的行为

因此更改如下。

printf("Enter Aircraft Id: (eg abeb11");
scanf("%lx",&id);

答案 1 :(得分:1)

No there is not, the standard input/output streams in C are much more low-level and do not support the concept of a base (nor the concept of outputting "a number", they are character streams).

Just use printf():

const int number = 4711;
printf("%d in hex is %x; in octal it's %o\n", number, (unsigned int) number,
       (unsigned int) number);

will print:

4711 in hex is 1267, in octal it's 11147

And no, there's no standard way of printing in binary, you're going to have to implement that on your own if you need it.

To input, you need to match the type of the variable with the type implied by the formatting specifier:

if(scanf("%lx", &id) == 1)
{
  printf("the ID is %lu (0x%lx)\n", id, id);
}

the type of hexadecimal numbers is unsigned with the printf() and scanf() family of functions.

答案 2 :(得分:0)

C ++具有类型安全的转换系统,用于从标准流中读取值。 setbase(16)用于更改输入基数,而不是指定自动处理的目标的类型。

在C中,scanf()函数使用格式字符串来指定目标变量的类型和如何对其进行转换,它不具有有关剩余参数的实际类型的信息。 scanf()支持十进制,八进制和十六进制转换:

  • %d将以十进制表示的可选带符号值转换为int变量
  • %u将以十进制表示的可选带符号值转换为unsigned int变量
  • %o将以八进制表示的可选带符号值转换为unsigned int变量
  • %x将以十六进制表示的带符号的可选值转换为unsigned int变量,
  • %lxunsigned long int变量执行相同的操作。无法告诉scanf()目标变量是long int,传递long int的{​​{1}}的地址具有未定义的行为,但是它被接受并且可以正常工作在大多数当前系统上获得正值。
  • %lx将以十进制,八进制或十六进制表示的可选带符号值转换为%i变量。基数由初始前缀(在可选空格和可选符号之后)确定:int代表八进制,0代表十六进制,否则为十进制。

请注意,您应该测试0x的返回值以检测无效或缺少的输入。

这是修改后的版本:

scanf()