/* 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
*/