C語言對傳入參數的處理


 

   /* 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()函數成對出現。

strdup()在內部調用了malloc()為變量分配內存,不需要使用返回的字符串時,需要用free()釋放相應的內存空間,否則會造成內存泄漏。該函數的返回值是返回一個指針,指向為復制字符串分配的空間;如果分配空間失敗,則返回NULL值。

 

 

   在程序中,有時需要將一個十六進制字符串轉換為十進制數字。比如:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM