传入多值参数处理

有些写程序不喜欢用Getopt::Long模块,但是一些perl脚本中有必要允许一个选项传入多个参数,比如oracle exp, analyze schema这类的脚本,需要允许一次运行export/analyze多个schema。这时候需要用push将多个值放入数组中。

 

==脚本==

#!/usr/bin/perl -w
#
# input_tst.pl
# Test the input usage

&get_input_parms;

foreach $schema (@schemas){
  print "$schema/n";
}

 

sub get_input_parms {
$arg = shift(@ARGV);
while ($arg)
{
 if($arg eq "-n" or $arg eq "-N")
 {
  push @schemas, shift(@ARGV); #用push
 }
 $arg = shift(@ARGV);
}
}

 

= 运行结果==

C:/temp1>perl input_tst.pl -n aa -n bb
aa
bb

<think> 首先,用户的问题是关于C语言中传入个参数的方法和示例。用户指定了要参考站内引用,所以我需要查看提供的引用内容。 引用的内容如下: - **引用[1]**: 展示了通过数组参数传递个结果。示例代码中,函数`calculate_array`接受一个整型数组`result[3]`作为参数,用于存储计算结果。调用时传递数组,函数修改数组内容。 - **引用[2]**: 解释了C语言的参数传递机制,特别是值传递。提到对于基本类型如int、float、char等,参数传递是按值传递的。 - **引用[3]**: 讨论如何使用C语言解析命令行参数通过`argc`和`argv`。提到对于更复杂的需求,可以使用第三方库。 - **引用[4]**: 涉及函数参数传递的例子,包括值传递和指针传递。代码展示了如何通过指针来修改变量的值。 - **引用[5]**: 似乎讨论如何传递函数参数作为任意数量的参数,但内容有点混乱,提到函数模板和仿函数,这可能与C++相关,而不是纯C语言。用户的问题是关于C语言的,所以我应该忽略C++相关内容。 用户的核心查询是“C语言传入个参数的方法和示例”。意思是C语言中如何传递个参数给函数。 在C语言中,函数可以接受个参数,方式有几种: 1. **直接传递个参数**:定义函数时指定个参数类型和名称。 2. **通过指针或引用传递**:使用指针来修改参数值,尤其是在需要返回个值时。 3. **通过数组传递**:传递数组作为参数,可以处理个值。 4. **通过结构体传递**:使用结构体封装个数据。 5. **命令行参数**:使用`argc`和`argv`从命令行获取个参数。 从引用中,[1]展示了数组传递,[2]和[4]讨论了值传递和指针传递,[3]是关于命令行参数的。 用户要求“尽可能的参考用户上一次的问题和你的回答”,但这是对话的开始,没有之前的用户问题或我的回答。系统提示中提到“参考用户上一次的问题和你的回答”,但在这个上下文中,这是第一个用户消息,所以我应该基于当前查询。 系统指令: - 回答结构清晰,逐步解决问题。 - 使用中文回答。 - 生成相关问题(在答案末尾)。 - 在引用段落末尾添加引用标识,例如[^number]。 - 数学表达式使用$...$或$$...$$。 在这个主题中,可能涉及数学较少,但如果有计算,我会处理。 结构化我的回答: 1. **引言**:简要介绍C语言中函数参数传递的方式。 2. **方法1: 直接传递个参数**:解释并给示例。 3. **方法2: 通过指针传递**:解释值传递的限制,使用指针修改个值。引用[4]的例子。 4. **方法3: 通过数组传递**:引用[1]的例子。 5. **方法4: 通过结构体传递**:这是一个常见方法,但未在引用中直接提到,我应该包括它,因为它相关。 6. **方法5: 命令行参数**:引用[3]。 7. **优缺点比较**:基于引用[2],讨论值传递的优缺点。 8. **总结**。 9. **生成相关问题**:在末尾。 确保引用标识添加: - 当提到引用内容时,在句子末尾添加[^number]。 例如: - 例如,可以通过数组来传递个结果[^1]。 - C语言基本类型参数传递是按值传递的[^2]。 现在,编写代码示例: - 使用代码块,如示例中所示。 回答语言:中文。 最终步骤: - 开始回答。 - 结束于相关问题。 </think> ### C语言传入个参数的方法和示例 在C语言中,函数参数传递支持种方式来传入个参数,核心机制包括直接传递个参数、使用指针修改值、通过数组或结构体封装数据等。C语言采用值传递(pass by value)作为默认方式,这意味着函数接收的是参数的副本而非原始变量[^2]。对于需要修改个值或返回个结果的情况,可以使用指针、数组或结构体来实现引用传递(pass by reference)的效果[^1][^4]。下面我将逐步介绍各种方法,结合引用内容并提供示例代码。 #### 1. **直接传递个参数** 这是最基础的方法,函数定义时指定个参数,调用时传入对应的值。适用于参数数量固定且函数不需要修改原始变量的场景。但由于值传递机制,函数内部修改不会影响外部变量[^2]。 - **示例**: 计算两个数的和、差、积。 ```c #include <stdio.h> // 函数接受三个参数:两个输入,三个指针用于存储结果 void calculate_values(int a, int b, int *sum, int *diff, int *product) { *sum = a + b; // 通过指针修改值 *diff = a - b; *product = a * b; } int main() { int x = 10, y = 5; int sum_result, diff_result, product_result; // 调用函数,传入个参数(包括指针) calculate_values(x, y, &sum_result, &diff_result, &product_result); printf("Sum: %d, Diff: %d, Product: %d\n", sum_result, diff_result, product_result); // 输出:Sum: 15, Diff: 5, Product: 50 return 0; } ``` 在这个示例中,通过指针参数间接实现了个结果的返回。直接传入值参数时(如`a`和`b`),函数无法修改它们,但指针(如`*sum`)允许函数写入外部变量[^4]。 #### 2. **通过指针传递个值** 当需要在函数中修改个外部变量时,使用指针是高效的方式。指针参数传递的是变量的地址,函数通过解引用操作修改原始内存,从而实现引用传递的效果。这避免了值传递的副本开销,尤其适合大型数据结构[^2][^4]。 - **示例**: 使用指针交换两个变量的值。 ```c #include <stdio.h> // 函数接受两个指针参数,用于交换值 void swap_values(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int num1 = 10, num2 = 20; printf("Before swap: num1 = %d, num2 = %d\n", num1, num2); // 调用函数,传入变量的地址 swap_values(&num1, &num2); printf("After swap: num1 = %d, num2 = %d\n", num1, num2); // 输出:After swap: num1 = 20, num2 = 10 return 0; } ``` 此方法基于值传递的原理:指针本身是按值传递的(传递地址的副本),但通过解引用操作可以修改指向的数据[^4]。 #### 3. **通过数组传递个值** 如果参数是一组同类型数据,可以传递数组作为参数。数组名在函数调用时退化为指针,因此函数可以访问并修改原始数组元素,适合批量处理数据[^1][^2]。 - **示例**: 计算并返回个结果通过数组参数(直接引用[^1])。 ```c #include <stdio.h> // 函数接受一个整数数组参数存储结果 void calculate_array(int a, int b, int result[3]) { result[0] = a + b; // 修改数组元素 result[1] = a - b; result[2] = a * b; } int main() { int res[3]; // 声明数组存储结果 calculate_array(10, 5, res); // 传递数组名 printf("Sum: %d, Diff: %d, Product: %d\n", res[0], res[1], res[2]); // 输出:Sum: 15, Diff: 5, Product: 50 return 0; } ``` 数组参数本质是指针操作(如`int result[3]` 等同于 `int *result`),允许高效传递和修改个元素[^1]。 #### 4. **通过结构体传递个值** 当参数是异构数据类型时,可以使用结构体(struct)封装个值。结构体作为参数传递时默认是值传递(创建副本),但可以传递结构体指针来避免复制开销并允许修改。 - **示例**: 定义结构体存储个计算结果。 ```c #include <stdio.h> // 定义结构体封装个值 typedef struct { int sum; int diff; int product; } CalcResult; // 函数接受结构体指针参数 void calculate_struct(int a, int b, CalcResult *result) { result->sum = a + b; result->diff = a - b; result->product = a * b; } int main() { CalcResult res; // 声明结构体变量 calculate_struct(10, 5, &res); // 传入结构体指针 printf("Sum: %d, Diff: %d, Product: %d\n", res.sum, res.diff, res.product); // 输出:Sum: 15, Diff: 5, Product: 50 return 0; } ``` 传递结构体指针类似于指针传递,高效且代码可读性强,尤其适合复杂数据[^2]。 #### 5. **命令行参数传递** 对于从命令行传入个参数,C语言使用`main`函数的`argc`和`argv`参数。`argc`表示参数个数,`argv`是指向参数字符串数组的指针[^3]。 - **示例**: 解析命令行参数并输出。 ```c #include <stdio.h> int main(int argc, char *argv[]) { printf("Number of command-line arguments: %d\n", argc); for (int i = 0; i < argc; i++) { printf("Argument %d: %s\n", i, argv[i]); } return 0; } ``` 编译后运行如`./program arg1 arg2`,输出将显示所有参数。对于复杂解析,可以使用第三方库简化[^3]。 #### 参数传递的优缺点总结 - **优点**: 值传递简单安全,避免意外修改;指针传递高效,节省内存;数组和结构体适用于批量数据[^1][^2]。 - **缺点**: 值传递可能导致性能开销(大型数据副本);指针传递需谨慎处理,避免野指针或内存错误[^4]。总体而言,选择方法取决于场景:简单修改用指针,批量数据用数组或结构体。 以上方法覆盖了C语言中传入个参数的主流方式。如果您有特定需求(如可变参数函数),C语言的`stdarg.h`库也支持`va_list`相关函数,但需注意类型安全风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值