2016-02-02 12:02:00 weixin_34361881 阅读数 52
/******************************************************************
 *                    linux C 数组操作
 * 声明:
 *     本文为解决陈颖奇遇到的C数组操作上的问题,主要是验证。
 *
 *                                 2016-2-2 深圳 南山平山村 曾剑锋
 *****************************************************************/

#include <stdio.h>

#define ARRAY_LENGTH 10

#define printd(argv) printf(" %d,", argv)
#define printdl(argv) printf(" %d\n", argv)

void print_array(int *array, int length) {
    
    int i = 0;
    for ( i = 0; i < length - 1; i++ ) {
        printd(array[i]);
    }
    printdl(array[i]);
}

int main( int argc, char **argv ) {
    int array[ARRAY_LENGTH] = {1, 2, 3, 4, 5, 0};

    print_array(array, ARRAY_LENGTH);

    int i = 0;
    for ( ; i < ARRAY_LENGTH/2; i++ ) {
        array[i+ARRAY_LENGTH/2] = array[i];
    }

    print_array(array, ARRAY_LENGTH);
}

/*
 * 输出结果:
 *     Qt@aplex:~/cmdTest/test$ ./a.out
 *      1, 2, 3, 4, 5, 0, 0, 0, 0, 0
 *      1, 2, 3, 4, 5, 1, 2, 3, 4, 5
 */

 

2017-05-06 16:46:52 sun1314_ 阅读数 10284

int main(int argc,char *argv[]);

第一个参数argc用来存放命令行参数的个数
第二个参数argv是指针数组,它是用来存放命令行中各个参数和命令字的字符串的
这里,argc的值和argv[]各元素的值都是系统自动组赋值的。


结果如下:


2018-10-21 20:57:07 qq_40563761 阅读数 2426

前言

在学习计组的时候,基本上都要在linux下编程,而下面这个:int main(int argc,char* argv[])肯定都见过,下面讲讲对于argc和argv的理解。

例子解析

 argc:它是一个整型数据,指的是往主函数传入参数的个数。
argv[]:它是一个指针数组,即每个数组元素都为一个指针,即每个数组元素都是一个地址变量,
每个元素存储的是字符串的首地址(字符串本身就是它的首地址)

下面来个具体例子:
编译好main.c这个文件后生成可执行文件main,输入指令 ./main Hello World
这时argc为3,分别为main,Hello,World;
此时的argv[0]=“main”;
argv[1]=“Hello”;
argv[2]=“World”;
再比如说我们想打印第二个参数中的字符’o’和第三个参数中的字符’o’
那就只要printf("%c,%c",argv[1][4],argv[2][2]);即可
其实就是字符串的基本知识

后记

每日一言

心随情碎,情随伤逝------三国杀春哥

2019-05-28 23:02:36 iT__SuperMan 阅读数 0

3.使用Shell数组
问题
本案例要求编写一个Shell脚本getips.sh,相关要求如下:
能够反复从键盘输入IP地址,保存到数组
当用户输入“EOF”后结束输入,显示数组IPADDS各元素的值
最后报告本次录入的IP地址个数、其中第1个录入的地址
方案
建立数组的方法:
格式1,整体赋值:数组名=(值1 值2 … … 值n)
格式2,单个元素赋值:数组名[下标]=值
查看数组元素的方法:
获取单个数组元素:[]{数组名[下标]} 获取所有数组元素:{数组名[@]}
获取数组元素个数:KaTeX parse error: Expected '}', got '#' at position 2: {#̲数组名[@]} 获取连续的多个…{数组名[@]:起始下标:元素个数}
获取某个数组元素的长度:KaTeX parse error: Expected '}', got '#' at position 2: {#̲数组名[下标]} 截取数组元素…{#数组名[下标]:起始下标:字符数}
步骤
实现此案例需要按照如下步骤进行。
步骤一:认识数组的赋值/引用基本方法
1)declare命令的使用
在Shell环境中,变量默认均作为字符串处理,当参与expr、[]使1+2X+2[]数学运算时自动作为整数处理。比如,使用“1+2”、“X+2”、“X+2”表达式是无法将运算结果直接作为整数赋值给指定的变量的:
[root@svr5 ~]# X=24
[root@svr5 ~]# A=1+2
[root@svr5 ~]# echo $A
1+2 //赋值结果为字符串
[root@svr5 ~]# A=X+2
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 40: …串 [root@svr5 ~]#̲ A=X+2
[root@svr5 ~]# echo $A
24+2 //赋值结果为字符串
上述操作中,变量A均作为字符串处理。
若要将一个变量强制设置为整数,可以使用declare命令声明(-i选项):
[root@svr5 ~]# declare -i A //先将A声明为整数变量
[root@svr5 ~]# A=1+2 //然后赋值
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 30: …3 [root@svr5 ~]#̲ declare -i B=X+2 //也可以在声明的同时进行赋值
[root@svr5 ~]# echo $B
26
declare命令结合-x选项,可以将局部变量设置为全局变量,这个与export命令的作用差不多:
[root@svr5 ~]# declare -x NM=“Tarena” //新建全局变量NM
[root@svr5 ~]# bash //进入子Shell环境
[root@svr5 ~]# echo $NM //验证全局变量
Tarena
[root@svr5 ~]# exit //返回到原Shell环境
exit
[root@svr5 ~]#
如果要取消变量的全局属性,可以使用“+x”选项:
[root@svr5 ~]# declare +x NM //将NM恢复为局部变量
[root@svr5 ~]# bash //进入子Shell环境
[root@svr5 ~]# echo $NM //检查已无法调用NM变量

[root@svr5 ~]# exit //返回到原Shell环境
exit
[root@svr5 ~]#
declare命令结合-r选项,可以为变量设置“只读”属性,只读变量的值不允许再被修改,通常可用来保存一些固定的参数,避免无意中被修改:
[root@svr5 ~]# echo $NM
Tarena
[root@svr5 ~]# declare -r NM //将变量NM设置为只读
[root@svr5 ~]# NM=“Tarena IT Group.” //重新赋值失败
-bash: NM: readonly variable
[root@svr5 ~]# echo $NM //查看还是原来的值
Tarena
只读变量除了不能修改值以外,也无法被unset清除(若要清除只读变量,需要退出当前Shell程序):
[root@svr5 ~]# unset NM
-bash: unset: NM: cannot unset: readonly variable
[root@svr5 ~]# echo $NM
Tarena
2)定义/赋值数组
使用declare命令,结合-a选项可声明一个数组(这个操作一般可不做),比如:
[root@svr5 ~]# declare -a SVRS
直接执行declare -a,即不指定数组名参数时,会列出当前Shell环境中已定义的所有数组设置:
[root@svr5 ~]# declare -a //查看已定义的数组
declare -a BASH_ARGC=’()’
declare -a BASH_ARGV=’()’
declare -a BASH_LINENO=’()’
declare -a BASH_SOURCE=’()’
declare -ar BASH_VERSINFO=’([0]=“3” [1]=“2” [2]=“25” [3]=“1” [4]=“release” [5]=“x86_64-redhat-linux-gnu”)’
declare -a DIRSTACK=’()’
declare -a FQDNS=’([0]=“www.tarena.com” [1]=“mail.tarena.com” [2]=“club.tarena.com”)’
declare -a FUNCNAME=’()’
declare -a GROUPS=’()’
declare -a PIPESTATUS=’([0]=“0” [1]=“0”)’
declare -a SVRS=’([0]=“www” [1]=“ftp” [2]=“mail” [3]=“club”)’
若要定义数组的成员,可以在declare声明时定义,也可以直接整体定义。整体赋值的格式为“数组名=(值1 值2 值3 … …)”,比如:
[root@svr5 ~]# MY_SVRS=(www ftp mail club)
[root@svr5 ~]# set | grep “MY_” //查看数组定义结果
MY_SVRS=([0]=“www” [1]=“ftp” [2]=“mail” [3]=“club”)
Shell中的语法要求是比较松散的,所以我们也可以直接为单个数组元素赋值,格式为“数组名[下标]=值”,每个数组元素的编号(即下标)从0开始。比如,以下操作会产生一个包括3个元素的数组:
[root@svr5 ~]# WEB_SVRS[0]=“www.tarena.com” //为第1个元素赋值
[root@svr5 ~]# WEB_SVRS[1]=“mail.tarena.com” //为第2个元素赋值
[root@svr5 ~]# WEB_SVRS[2]=“club.tarena.com” //为第3个元素赋值
[root@svr5 ~]# set | grep “WEB_” //查看数组定义
WEB_SVRS=([0]=“www.tarena.com” [1]=“mail.tarena.com
[2]=“club.tarena.com”)
为数组元素赋值时,并不要求每个成员都需要指定,下标也可以不连续。比如,可跳过下标3,直接为下标为4的元素赋值:
[root@svr5 ~]# WEB_SVRS[4]=“tts6.tarena.com
[root@svr5 ~]# set | grep “WEB_” //确认设置结果
WEB_SVRS=([0]=“www.tarena.com” [1]=“mail.tarena.com” [2]=“club.tarena.com” [4]=“tts6.tarena.com”)
3)查看数组、查看数组元素
输出整个数组的内容:
[root@svr5 ~]# echo ${MY_SVRS[@]}
www ftp mail club
查看第1个(下标为0的)数组元素:
[root@svr5 ~]# echo ${MY_SVRS[0]}
www
或者
[root@svr5 ~]# echo ${MY_SVRS} //省略下标时,默认视为0
www
输出下标为2的数组元素:
[root@svr5 ~]# echo ${MY_SVRS[2]}
mail
输出数组中下标从1开始的2个元素:
[root@svr5 ~]# echo ${MY_SVRS[@]:1:2}
ftp mail
查看数组的元素个数:
[root@svr5 ~]# echo ${#MY_SVRS[@]}
4
[root@svr5 ~]# echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲WEB_SVRS[@]} 4 …IP" != “EOF” ]
do
IPADDS[i]=&quot;i]=&quot;IP" //每次录入赋值给不同的数组元素
let i++
done
echo “您已录入的IP地址如下:”
echo ${IPADDS[@]} //输出整个数组
echo “总共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 个地址,…{IPADDS[0]}” //输出第1个元素
[root@svr5 ~]# chmod +x getips.sh
3)验证、测试脚本
[root@svr5 ~]# ./getips.sh
请添加IP地址(输EOF结束):192.168.4.77
请添加IP地址(输EOF结束):172.16.16.220
请添加IP地址(输EOF结束):218.56.57.58
请添加IP地址(输EOF结束):192.168.1.5
请添加IP地址(输EOF结束):192.168.1.202
请添加IP地址(输EOF结束):220.106.0.20
请添加IP地址(输EOF结束):EOF
您已录入的IP地址如下:
192.168.4.77 172.16.16.220 218.56.57.58 192.168.1.5 192.168.1.202 220.106.0.20
总共包括 6 个地址,
其中第1个IP地址是:192.168.4.77
4)遍历数组元素时分行显示
当数组元素的内容较多时,直接输出 KaTeX parse error: Expected 'EOF', got '#' at position 131: …: [root@svr5 ~]#̲ vim getips.sh …IP" != “EOF” ]
do
IPADDS[i]=&quot;i]=&quot;IP"
let i++
done
echo “您已录入的IP地址如下:”
#echo ${IPADDS[@]}
i=0 //控制下标增长的变量
while [ $i -lt ${#IPADDS[@]} ] //条件为下标小于元素个数
do
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {IPADDS[@]:i:4} //输出连续的四个元素
let i+=4 //下标自增4
done
echo “总共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 个地址,…{IPADDS[0]}”
验证脚本执行效果:
[root@svr5 ~]# ./getips.sh
请添加IP地址(输EOF结束):192.168.4.77
请添加IP地址(输EOF结束):172.16.16.220
请添加IP地址(输EOF结束):192.168.1.5
请添加IP地址(输EOF结束):192.168.1.202
请添加IP地址(输EOF结束):10.0.0.17
请添加IP地址(输EOF结束):10.0.0.27
请添加IP地址(输EOF结束):220.106.0.20
请添加IP地址(输EOF结束):202.110.79.81
请添加IP地址(输EOF结束):61.133.84.128
请添加IP地址(输EOF结束):61.133.84.72
请添加IP地址(输EOF结束):EOF
您已录入的IP地址如下:
192.168.4.77 172.16.16.220 192.168.1.5 192.168.1.202
10.0.0.17 10.0.0.27 220.106.0.20 202.110.79.81
61.133.84.128 61.133.84.72
总共包括 10 个地址,
其中第1个IP地址是:192.168.4.77

2017-08-01 11:58:00 weixin_30832143 阅读数 0

  今天在开发Perl脚本的时候遇到了一个问题:qualcomm给出的samples中的代码都用ARGV数组的元素个数来进行判断,代码如下:

sub ParseArguments
{
   # Assume failure
   my $RC = false;
   my $Txt = "";
   my $Help =
      "Syntax: Perl grep_isf.pl <Input_ISF_File.isf> <string_to_be_searched> \n"
    . "Eg:     Perl grep_isf.pl s1.isf \"MC_RESET|jammer in max bin\" \n";

   if ($#ARGV < 0)
   {
      print "\n$Help\n";
      return $RC;
   }

   my $ISFFileName = $ARGV[0];
   if ($ISFFileName eq "")
   {
      $Txt = "Invalid ISF file name\n\n" . $Help;
      print "\n$Txt";

      return $RC;
   }

   $ISFAbsolutePath = GetPathFromScript();
   if ($ISFAbsolutePath eq "")
   {
      $Txt = "Invalid ISF file name\n\n" . $Help;
      print "\n$Txt";

      return $RC;
   }
   else
   {
      $ISFAbsolutePath .= $ISFFileName;
   }

   $SearchString = $ARGV[1];
   if ($SearchString eq "")
   {
      $Txt = "Invalid Search String\n\n" . $Help;
      print "\n$Txt";

      return $RC;
   }

   # Success
   $RC = true;
   return $RC;
}

但是穷尽了一生也没有找到ARGV的声明,这时候郭宏跑过来和我抱怨这个东西运行不了,我就随手查了查,才发现别有洞天。

ARGV其实是主函数默认的两个参数之一,数组中存储的是指令的详细内容。

举个例子: 我们写好了hello.exe 一般都是直接运行,没有添加任何的参数。但是作为一个合格的EXE,它是可以通过命令行来添加参数的,比如我们可以执行:hello.exe a b c d e

这样ARGV数组中的存储内容如下:

               argv[0] = hello.exe;

    argv[1] = a;

    argv[2] = b;

    argv[3] = c;

    argv[4] = d;

    argv[5] = e;

 所以我觉得这个automation 脚本和QXDM之前的关系应该是通过命令行的参数和命令联系起来的。下午再想想,吃饭去

转载于:https://www.cnblogs.com/linux0537/p/7267734.html