zoukankan      html  css  js  c++  java
  • 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]. ",argv[0]);
                return -1;
            case ':':
                printf("-%c miss option argument. ",optopt);
                return -1;
            case '?':
                printf("-%c is invalid option. ",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
    */

  • 相关阅读:
    TUN/TAP区别
    从日志文件解决ArcGIS Server性能低下问题的步骤(1)
    java异常
    Maven
    前车之鉴-web篇
    图论复习总结
    奇(qi)谋(ji)巧(yin)计(qiao)
    莫比乌斯反演呓语
    学习后缀数组笔记
    浅读叶青学长竞赛学习知识目录
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/11446841.html
Copyright © 2011-2022 走看看