将在命令行中输入的十六进制值存储到整数

时间:2014-09-05 15:26:40

标签: c

#include<stdio.h>
int main(int argc,char* argv[]){
        int hex;
        printf("\n argc : %d argv[1] : %s \n",argc,argv[1]);
        hex = argv[1];
        printf("\n hex : %x \n",hex);
        return 0;
}

O / P:

[root@ld]# ./a.out 343ed4

 argc : 2 argv[1] : 343ed4

 hex : 9e1a4aa8

我想存储从命令行参数获得的十六进制值并将其存储在整数上。上面的程序,当存储十六进制值时,会给出与用户给定值不同的结果。 不能使用atoi,因为它会在数字之后剪切字母表。如何将在命令行参数中输入的十六进制存储为整数。

2 个答案:

答案 0 :(得分:5)

这是不正确的:

hex = argv[1];

编译器应警告您将char*分配给int,因为argv[1]是十六进制数字的字符串表示形式(即{'3','4','3','e','d','4','\0'}),而不是十六进制数字本身。

你需要这样做:

sscanf(argv[1], "%x", &hex);

sscanf为您解析十六进制数,并将结果存储在hex

答案 1 :(得分:4)

根据dasblinkenlight

你需要这样做:

sscanf(argv[1], "%x", &hex);

BUT

sscanf返回成功解析的参数数量(如在%x中)。所以我会添加一个检查它是1.如果它没有输入可以解析成十六进制的东西。

printf("\n argc : %d argv[1] : %s \n",argc,argv[1]);
if (sscanf(argv[1], "%x", &hex)==1)
    printf("\n hex : %x \n",hex);
else
    printf("\nargv[1] is not a valid hex value.");

如果您没有检查返回值,则不会在代码中找到失败点。

sscanf可用于匹配模式并从中提取变量值,例如日期导入:

int day, month, year;
int count = sscanf (inputstr, "%d/%d/%d", &day, &month, &year );
if (count!=3)
     printf("bad date value");