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

C语言对传入参数的处理的更多相关文章

  1. shell中调用R语言并传入参数的两种步骤

    shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...

  2. C语言的本质(16)——函数接口的传入参数与传出参数

    如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcp ...

  3. 《OOC》笔记(3)——C语言变长参数va_list的用法

    <OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...

  4. 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  5. C语言中可变参数的函数(三个点,“...”)

    C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...

  6. C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  7. js函数定义参数个数和实际传入参数的对比

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  8. Qt传入参数argc argv[]

    QtCreator是非常不错的IDE,最近在做的Qt命令行应用,因为调试的环境不同等问题,需要在调试的时候为 main() 传入参数.度娘了半天,没找到方法,只能自力更生.后来在“项目-构建和运行-运 ...

  9. Python传入参数的几种方法

    写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...

随机推荐

  1. 系统分析与设计HW8

    描述软件架构与框架之间的区别与联系 软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计.架构模式(style)是特定领域常见问题的解决方案. 框架是特定语言和技术的架构应用 ...

  2. Python学习之==>常用字符串方法

    1.常用字符串方法 a = '\n 字 符 串 \n\n' b = a.strip() # 默认去掉字符串两边的空格和换行符 c = a.lstrip() # 默认去掉字符串左边的空格和换行符 d = ...

  3. wpf 非窗体类中 异步调用窗体与控件

    App.Current.Dispatcher.Invoke((Action)(() => { MessageBoxWindow mwb = ); mwb.ShowDialog(); return ...

  4. SQLSERVER 和 ORACLE 查询数据库文件大小

    SQLSERVER: SQLSERVER一个库的文件分为数据文件(行数据)和日志文件两个文件,详情可以在数据库的属性->文件中查看. 在资源管理器中打开文件所在路径可以直接看到这两个文件 但是, ...

  5. SAMBA服务和FTP服务讲解

    rz sz window和Linux之间小文件的传输 yum install lrzsz -y rz:window文件传送到linux中 sz:把Linux文件传送到window 防火墙: 立即关闭但 ...

  6. 【ABAP系列】SAP ABAP 从FTP服务器读取文件到本地

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 从FTP服务器 ...

  7. 【MM系列】SAP MM模块-货物移动对标准价的影响

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-货物移动对标准价的 ...

  8. 学习kettle遇到的问题

    一. 解决mysql连接缺少驱动问题:http://www.mamicode.com/info-detail-1724584.html 1.下载驱动 https://dev.mysql.com/dow ...

  9. Anaconda版本

    1. Anaconda各种版本 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 2. 多个Python环境 conda info -e c ...

  10. Mysql常用时间函数的用法和应用

    /* ---1)整型时间戳转换为date的格式(yyyymmdd, yyyy年mm月dd)--*/ , '%Y%m%d' ); -- 20090806 , '%Y年%m月%d' ); -- 2009年 ...