Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418074
  • 博文数量: 48
  • 博客积分: 1032
  • 博客等级: 上士
  • 技术积分: 1256
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-19 13:24
文章分类

全部博文(48)

文章存档

2014年(3)

2013年(23)

2012年(22)

分类: C/C++

2012-11-14 19:17:05

    在C/C 里面关于主函数main函数的定义时,大多时候我们采用的是int main(void)这种形式,不用带参数;但是标准的定义一般有两种格式:
  1. int main(int argc,char *argv[]);
  2. int main(int argc,char **argv);
参数说明:
argc表示传送主函数参数的个数;
argv[]:指向字符串的指针数组,其中argv[0]是命令本身,也就是程序本身,每个参数用空格隔开;

关于指针数组:表示该数组的所有元素都是指针。

最简单的列举函数参数个数的例子:

  1. #include <stdio.h>
  2. int
  3. main(int argc,char *argv[])
  4. {
  5. while (argc--){
  6. printf("argv[%d]=%s\n",argc,argv[argc]  );
  7. }
  8. return 0;
  9. }
运行结果:

   由于我想在程序里面根据传送数据(实参)的位数分配内存,所有这里我想讲述的是如何获取每一个参数的长度。
首先看看char **argv这个参数:
    argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址指针数组的长度即为参数个数。数组元素初值由系统自动赋予。下面是具体的存储示意图:
下面是一个实例程序:
    功能就获取argv[1]的长度,将argv[1]存放到一个数组里面去,然后打印出来;关键是在于下面红色代码对指针的操作,在移动指针之后,想再次取得argv[1]里面的内容就得将指针移动回来,否则就去到了argv[1]后面内存中的内容,出现错误。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. int
  5. main(int argc,char **argv)
  6. {    
  7.     int i = 0;
  8.     int strlen = 0;
  9.     int cnt = 0;
  10.     if ( argc != 2 ){
  11.         fprintf(stderr,"please input %s's parameter\n",argv[0]);
  12.         exit(1);
  13.     }

  14.     for ( cnt = 0; (*argv[1]++) != '\0'; )
  15.         cnt++;

  16.     printf ( "argv[1]'s size:%d\n",cnt );

  17.     for ( i = 0; i < cnt+1; i++ )//让指针回到初始位置
  18.         *argv[1]--;

  19.     char *input;
  20.     input = (char *)malloc(cnt*sizeof(cnt));
  21.     memset(input,'\0',sizeof(input));
  22.     sscanf(argv[1],"%s",input);
  23.     printf("input is:%s\n",input);
  24.     for( i = 0; i < 10; i++ ){
  25.         if(input[i] != '\0'){
  26.             strlen++;
  27.             printf("input[%d]=%c\n",i,input[i]);
  28.         }
  29.     }
  30.     printf("the array's sizeis:%d\n",strlen);
  31.     free(input);
  32.     return 0;
  33. }
运行结果:









阅读(2752) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

最大行业软件2012-11-16 09:34:05

Oasys.Pile.V19.0
Oasys.Pilset.V19.1
Oasys.Safe.V19
Oasys.Slope.V19
Oasys.Xdisp.V19

Plaxis V8.5
Plaxis 3D Foundation V1.6
PLAXIS_3D_TUNNEL_V1.2
Plaxis.2D.V9.02.612
UDEC31 岩土分析软件
Z_soil2D V6.13 岩土分析软件
代尔夫特(DELFT)岩土所计算软件
DIGITAL_CANAL系列软件
LEAP_SOFTWARE_PRESTO_V8.6.1
LEAP_SOFTWARE_RC_PIER_V4.01桥梁工程软件
LEAP_SOFTWARe_LEAP_BRIDGE_V6.0
LEAP_SOFTWARE系列软件
SAM-LEAP5.V5.10D 桥梁设计