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()函数成对出现。
在程序中,有时需要将一个十六进制字符串转换为十进制数字。比如:
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语言对传入参数的处理的更多相关文章
- shell中调用R语言并传入参数的两种步骤
		
shell中调用R语言并传入参数的两种方法 第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output ...
 - C语言的本质(16)——函数接口的传入参数与传出参数
		
如果函数接口有指针参数,既可以把指针所指向的数据传给函数使用(称为传入参数),也可以由函数填充指针所指的内存空间,传回给调用者使用(称为传出参数),例如strcpy的函数原型为 char *strcp ...
 - 《OOC》笔记(3)——C语言变长参数va_list的用法
		
<OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...
 - 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
		
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
 - C语言中可变参数的函数(三个点,“...”)
		
C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...
 - C语言 命令行参数 函数指针 gdb调试
		
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
 - js函数定义参数个数和实际传入参数的对比
		
因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...
 - Qt传入参数argc argv[]
		
QtCreator是非常不错的IDE,最近在做的Qt命令行应用,因为调试的环境不同等问题,需要在调试的时候为 main() 传入参数.度娘了半天,没找到方法,只能自力更生.后来在“项目-构建和运行-运 ...
 - Python传入参数的几种方法
		
写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...
 
随机推荐
- jquery自动播放音频文件
			
使用jquery自动播放音频文件 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
 - 构造Map并对其排序
			
#构造Map并对其排序 attr_tul = ['a','b','c','d','e','f'] one_tul = [,,,,,] one_dic = {} for i in range(len(a ...
 - 移动端自动化==>Appium定位方式总结
			
1.ID Android Android的resource-id对应ID定位方式,可以通过index来获取需要的元素(从0开始查找dom树中的同名resource-id属性).使用appium-des ...
 - 【SSH】---【Struts2、Hibernate5、Spring4】【散点知识】
			
一.Struts21.1.Struts2的概念Struts2是一个用来开发MVC应用程序的框架,它提供了Web应用程序开发过程中的一些常见问题的解决方案: ->对来自用户的输入数据进行合法 ...
 - cocos2dx基础篇(21) 进度条CCProgressTimer
			
[3.x] (1)去掉 "CC" (2)CCProgressTimerType 改为强枚举 ProgressTimer::Type:: // RADIAL //扇形进度计时器 BA ...
 - codeforces 1186C Vus the Cossack and Strings
			
题目链接:https://codeforc.es/contest/1186/problem/C 题目大意:xxxxx(自认为讲不清.for instance) 例如:a="01100010& ...
 - 20191127 Spring Boot官方文档学习(4.18-4.24)
			
4.18.JTA的分布式事务 通过使用Atomikos或Bitronix嵌入式事务管理器,Spring Boot支持跨多个XA资源的分布式JTA事务.部署到合适的Java EE应用程序服务器时,还支持 ...
 - js函数的定义和调用
			
函数的定义 函数使用function 声明,后跟一组参数以及函数体,语法如下: function functionName([age0,age1,......argn]){ statements } ...
 - vue防止 由于网速出现 闪现{{}}
			
防止闪现可能应为网速的原因{{msg}} 一直解析不了, 于是用户就看到它了,不友好, 于是 vue推出 与css配合 [v-cloak] {display:none}
 - C++ vector、list和deque的区别 (整理)
			
1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变.因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内 ...