我正在尝试编写一个简短的脚本来接受6个输入(十进制,十六进制或八进制)并输出其十进制版本。例如,如果我输入1,则应输出1。输入010,应该得到8,输入0x20的,应该得到32.我是否必须测试每个值,看是否scanf函数读取它作为其类型或scanf后,我可以投他们读它们都作为是什么?另外,我是否需要将八进制和十六进制值转换为十进制的函数,还是可以强制转换?我是C语言的新手,现在还不太了解它,但这是我到目前为止的内容(无论出于何种原因,它输出-200为32765):
int num[6];
printf("Enter six integers:\n");
int i = 0;
int j;
while (i < 6){
if(scanf("0x%x", &j) == 1){
scanf("0x%x", &num[i]);
//hexToDec(num[i]);
} else if (scanf("0%o", &j) == 1){
scanf("0%o", &num[i]);
//octalToDec(num[i]);
} else {
scanf("%i", &num[i]);
}
i+=1;
}
for(int p = 0; p < 6; p+=1){
printf("%i\n", num[p]);
}
答案 0 :(得分:2)
答案以供将来参考:简单地在与扫描“%i”的自动执行转换。修改后的代码如下:
Value = "%" + agentName + "%"
}
答案 1 :(得分:1)
您不能使用scanf("0x%x", &j)
测试输入,然后使用scanf("0x%x", &num[i])
将值放入num[i]
。 scanf
使用接受的字符,因此它们不再出现在输入流中。当您执行第二个scanf
时,字符消失了。
相反,只需尝试扫描所需的东西即可。如果一切正常,你做。如果不起作用,请继续执行else
:
if (scanf("0x%x", &num[i]) == 1)
; // Worked, nothing to do.
else if (scanf("0%o", &num[i]) == 1)
;
else if (scanf("%i", &num[i]) == 1)
;
else
{
// Nothing worked, should put error-handling code here.
}
对于实际的应用程序来说,这实际上并不是很好的代码,因为scanf
即使最终失败也会消耗一些输入。例如,对于scanf("0x%x", &num[i])
,如果输入包含“ 0x”但随后包含非十六进制字符,则scanf
将使用“ 0x”,但保留下一个字符。然而,就足够了一个学习锻炼。
一旦您在num
数组中有值,它们就是int
值。它们是数学值,而不是八进制,十进制或十六进制的数字。您可以将%o
打印为八进制,或者将%d
或%i
打印为十进制。原始数字无关紧要。在打印时,数学值将用于在所请求的基于格式的字符串。
请勿使用%x
来打印int
,因为%x
是unsigned int
的用法。但是,您可以将int
转换为unsigned int
,然后用%x
打印。
请注意,你不应该扫描到int
与{对象{1}}。 %x
用于扫描到%x
个对象。实际上,你可以扫描十六进制,八进制,十进制和使用:
unsigned int
if (scanf("%i", &num[i]) == 1)
;
else
…
规范将识别以“ 0x”开头的十六进制数字,以“ 0”开头的八进制数字和十进制数字。
如果您不想全部使用%i
,则由于某种原因要直接控制,则需要编写更多代码。标准C没有提供将十六进制数字仅扫描到%i
的直接方法。您将需要从输入中获取字符并从它们中计算值,或者扫描到int
,然后将结果转换为unsigned int
。
答案 2 :(得分:0)
您可以将函数strtol
与基数0
一起使用,以根据输入字符串格式自动检测整数值的基数(例如,参见strtol文档,网址为cppreference.com):
长strtol(const char * str,char ** str_end,int base)
解释在一个字节串的整数值由STR指向。 ... 的有效的整数值由以下几部分组成:
- (可选)加号或减号
- (可选)前缀(0)表示八进制基数(仅当基数为8或``0''时适用)
- (可选)前缀(0x或0X),表示十六进制的基数(仅在基数为16或``0''时适用)
如果base的值是``0'',则会自动检测数字基数。
因此,像long val = strtol("0x10",NULL,0);
这样的调用将产生十进制值16。
请注意,还可以使用scanf
与格式指示符一起%i
,因为这被定义为只表现为到呼叫strtol
:
<强> INT的scanf(常量字符*格式,...)强>
%i 匹配一个整数。数的格式是()与用于基础参数的值0作为预期由strtol将是相同的(碱是 由第一字符确定解析)
答案 3 :(得分:0)
快速答案是仅使用
if(scanf("%i", &j) == 1){
...
}
到目前为止我所拥有的(无论出于何种原因,它输出-200为32765):
scanf()
的错误处理很麻烦。最好使用fgets()
阅读用户输入的 line ,然后解析该行-也许使用strtol()
。