/* Loop through argv parsing options. */
while ((c = getopt(argc, argv, ":f:a:l:h")) != -1) {
switch (c) {
case 'f':
filename = strdup(optarg);
break;
case 'a':
ddr_addrp = strdup(optarg);
if(ddr_addrp[0]=='0'&&(ddr_addrp[1]=='x'||ddr_addrp[1]=='X'))
ddr_addr = strtol(ddr_addrp,&stop,16);
else
ddr_addr = atoi(ddr_addrp);
break;
case 'l':
filesizep = strdup(optarg);
if(filesizep[0]=='0'&&(filesizep[1]=='x'||filesizep[1]=='X'))
filesize = strtol(filesizep,&stop,16);
else
filesize = atoi(filesizep);
break;
case 'h':
printf("Usage: %s -f [filename] -a [DDR address] -l [filesize].\n",argv[0]);
return -1;
case ':':
printf("-%c miss option argument.\n",optopt);
return -1;
case '?':
printf("-%c is invalid option.\n",optopt);
return -1;
}
}
C语言的确博大精深,在C语言的世界中遨游了那么多年,发现自己仍是菜鸟一枚,很多利器没有能够驾驭,今天介绍一个神兽,威力无比,但是却很少人能用得好。
函数原型:
#include <string.h>
char *strdup(const char *s);
函数介绍:
strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现。
在程序中,有时需要将一个十六进制字符串转换为十进制数字。比如:
char *ptr = "0x11";
int n = 0;
//我们想让n等于0x11, 即17
通常我们在C中,想将一个字符串转换为一整型数字,通常会使用下面的方法:
char *ptr="123";
int n=0;
n=atoi(ptr);
printf("%d/n",n);
//输出:123
但是atoi库函数只能将十进制字符串转化为int整型,比如下面的例子:
#include <stdlib.h>
#include <stdio.h>//atoi头文件
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str); //int atoi(const char *nptr);
printf("string = %s integer = %d/n", str, n);
return 0;
}
/*输出:
string = 12345.67 integer = 12345
*/
所以,要用atoi函数将"0x11"转化为十进制整型17是不行的。如果用的话,会输出下面的结果:
int n;
char *str = "0x11";
n = atoi(str); //返回值n等于0 (显然不是我们想要的结果)
方法1:
#include <stdio.h>
int main()
{
char szValue[] = "0x11";
int nValude = 0;
sscanf(szValue,"%x",&nValude);
printf("%d/n",nValude);
return 0;
}
/*输出:
17
*/
主要用到sscanf这个库函数:
函数名:sscanf
功能:执行从字符串中的格式化输入
用法:int sscanf ( char *string, char *format[, argument, ...] ); //%x就是我们想要格式化的类型,即输出十六进制
方法2:
#include <stdio.h>
#include <stdlib.h>//strtol头文件
int main()
{
char *p="0x11";
char *str;
int i = (int)strtol(p, &str, 16);//十六进制
printf("%d/n",i);
return 0;
}
/*输出:
17
*/
这里主要用到strtol这个库函数,它的使用方法是:
函数名:strtol
功能:将串转换为长整数
用法:long strtol( char *str, char **endptr, int base ); //base指明我们要转换为几进制数
int main(void)
{
char *string = "0x11", *endptr;
long lnumber;
/* strtol converts string to long integer */
lnumber = strtol(string, &endptr, 16);
printf("string = %s long = %ld/n", string, lnumber);
return 0;
}
/*输出:
string = 0x11 long = 17
*/