输出未知输入的十进制版本

时间:2019-01-31 20:06:48

标签: c hex decimal octal

我正在尝试编写一个简短的脚本来接受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]);
    }

4 个答案:

答案 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,因为%xunsigned 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()