main(int argc , char *argv[])使用

本文详细解析了fcntl函数在UNIX环境编程中的应用,通过实例展示了如何使用fcntl来重定向标准输入、输出和错误,并解释了不同参数值所对应的操作模式,如readonly、writeonly、readwrite等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

if (fcntl(atoi(argv[1],O_RDONLY)<0)...

   在steven的 <UNIX环境编程> 这本书中,关于fcntl函数的运用中,有如下:
     #./a.out 0 < /dev/tty
         结果:read only
         #./a.out 1 >temp.foo
         结果:write only
         #./a.out 1
         结果:read write
         #./a.out 2 2>>temp.foo
         结果:write only,append
         #./a.out 5 5<>temp.foo
         结果:read write
    
   举个例子:
     (1).参数问题
         #./pro1 file1 file2>file3
       时,仅有pro1和file1传递给了pro1进程,分别作为argv[0],argv[1].
       而file2>file3由shell处理,在fork()之后,执行exec系统调用前,打开文件file3,并将文件file3的句柄复制到file2,
       并在exec时设置文件句柄file2打开.
     
     1>.所以以上执行时,#./a.out 1 >temp.foo,1是标准输出,表示STDOUT_FILENO,此时1的句柄被重定向写到一个文件中,所以
       结果正好是:write only. (temp.foo以只写方式打开)
     2>.执行#./a.out 1
       这个时候,由于0,1,2句柄都是指向你的登陆终端文件,而该终端是刻度写的,所以是read write.
     3>.执行#./a.out 2 2>>temp.foo    
       时,shell在open temp.foo时,加了个APPEND标志,以表明是追加.
     4>.同样,执行#./a.out 5 5<>temp.foo时,<为读出,>为重定向输入,所以结果为:read write.

 

 

 

 

unix下创建一个文件

vi    yan.c

 

#include <stdio.h>

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

{

     printf ("%d \n",argc);

    for (int i =0 ;i<argc ;i++)

      printf("%s \n", argv[i]);

 

return 0;

}

 

编译一下

gcc yan.c  -o yan.out --std = c99

 

运行一下

 

$ yan.out yan  zheng  qing
4
yan.out
yan
zheng
qing

 

 

 

 

 

 

 

 

<think>嗯,用户想了解C/C++中main函数的参数argcargv的作用。首先,我需要回忆自己之前学过的知识。记得main函数有两种常见的参数形式:int argcchar** argv,或者char* argv[]。argc应该是参数的数量,而argv是具体的参数数组。 然后,根据引用的资料,比如引用[1]提到argc是参数个数,argv是指向参数字符串的指针数组。引用[2]还特别指出argv[0]是程序的名称,包含完整路径,所以实际用户输入的参数个数是argc减1。比如运行程序时输入./test arg1 arg2,那么argc就是3,argv[0]是程序名,argv[1]和argv[2]是用户输入的参数。 需要解释清楚每个参数的含义,以及它们如何被程序使用。例如,在命令行工具中,用户经常通过参数指定选项或文件路径,比如gcc -o test test.c,这时候argcargv就用来获取这些参数。 还要考虑不同操作系统下的情况,比如Windows和Linux是否处理方式一致。不过引用[2]和[4]的例子都是基于Linux的,可能需要注意跨平台的一致性。不过一般来说,C/C++的标准在这部分是跨平台的。 可能还需要举例子,比如在引用[3]中的示例代码,遍历所有参数并打印出来,这样用户能直观看到argcargv的值。还有引用[4]中的OpenCV例子,用argv[1]作为图片路径,说明实际应用中的用法。 用户可能会混淆argv[0]的作用,需要强调它通常是程序名,而不是用户输入的参数。同时,当没有参数时,argc是1,argv[0]还是存在的。 最后,生成相关问题时要考虑用户可能的后续疑问,比如如何处理参数类型转换,参数解析的库,或者常见错误处理,比如参数不足时的应对措施。</think>### C/C++中main函数参数argcargv的作用 在C/C++程序中,`main`函数的参数`argc`和`argv`用于接收命令行输入的参数,具体作用如下: #### 1. **参数定义** - **`argc`(Argument Count)** 表示命令行参数的总个数,类型为`int`。**包括程序自身的名称**。例如,若执行命令`./demo file1.txt file2.txt`,则`argc`的值为3(程序名`./demo` + 两个文件参数)[^1][^2]。 - **`argv`(Argument Vector)** 类型为`char*[]`或`char**`,是一个字符串指针数组,存储所有命令行参数的字符串形式。其中: - `argv[0]`:程序名称(包含完整路径,如`./demo`); - `argv[1]`到`argv[argc-1]`:用户输入的实际参数[^3]。 #### 2. **核心功能** - **传递运行时配置** 通过命令行参数向程序传递外部输入(如文件路径、操作模式等)。例如: ```bash ./image_processor input.jpg --output=output.png ``` 程序可通过`argv[1]`获取输入文件路径,`argv[2]`获取输出配置[^4]。 - **支持脚本化调用** 在自动化脚本中,参数可用于动态控制程序行为(如批处理文件、测试用例等)。 #### 3. **代码示例** ```cpp #include <iostream> int main(int argc, char** argv) { std::cout << "程序名: " << argv[0] << std::endl; for (int i = 1; i < argc; i++) { std::cout << "参数" << i << ": " << argv[i] << std::endl; } return 0; } ``` 执行`./test hello world`时,输出: ``` 程序名: ./test 参数1: hello 参数2: world ``` #### 4. **注意事项** - **参数合法性检查** 需验证`argv`索引是否越界(例如`i < argc`),否则可能引发未定义行为。 - **类型转换** `argv`中的参数均为字符串,需手动转换为数字(如`std::stoi`)或其他类型。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值