- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我才知道我们可以给主函数两个参数,即“argc”和“argv”。但是我无法理解其中的 argv 是什么:int main(int argc, char* argv[]);
argv 是字符数组吗?还是指向字符的指针数组?无论哪种方式,我都在寻找一种方法来打印出用户传递给该程序的参数。这是我写的代码,但可以这么说,它并没有打印 argv。这有什么问题吗?我想是我对 argv 的理解导致这段代码不正确。
#include<stdio.h>
int main(int argc, char *argv[])
{
int i;
printf("%d\n",argc);
for(i=0;i<argc-1;i++)
{
printf("%s",*argv[i]);
}
return 0;
}
根据我从答案中得到的建议,我按如下方式更正了我的代码。
#include<stdio.h>
int main(int argc, char *argv[])
{
int i;
printf("%d\n",argc);
for(i=1;i<argc;i++)
{
printf("%s",argv[i]);
}
return 0;
}
我在 Windows 8.1 电脑上的 VMWare 中使用 Ubuntu Linux。这是我得到的输出。它只是打印 argc,之后什么也没有。有什么问题?是我编译它的方式还是在 Linux 终端中的方式?
在上图中,我希望再次打印数字 2、4、5、3,但它们没有打印出来。
谢谢。
最佳答案
让我们一步步解释清楚。首先,当您通过调用类似...的方式来调用您的程序时
./my-program arg0 arg1 arg2
您要向它传递一系列三个参数,对吗?每个参数都是一个字符串,对吧?现在,main
函数可以具有两个原型(prototype)之一,如 C 标准所指定的...
int main(); // Let's not worry about this for now
int main(int argc, char **argv);
想法是 main
能够处理您提供的参数。 argc
提供参数的数量。如果您注意到,在传递三个参数时,argc
是 4!发生这种情况是因为第一个参数在所有其他参数 ./my-program
之前传递,并让您的程序识别自己。
现在,char **argv
是什么意思? X*
形式的东西是指向 X
的指针,对吗?所以,char *
是指向char
的指针,而char **
是指向char
的指针。在 C 语言中,字符串只是一个以零结尾的 char
数组,数组可以“降级”为指针。这意味着 argv
是一个字符串数组,其中第一个 argv[0]
是程序的名称。
现在,C 标准允许您为 main
编写任何“兼容”原型(prototype)。例如,您可以编写任何这些...
int main(int argc, const char *const argv[]);
int main(int argc, const char *argv[])
int main(int argc, const char **argv);
int main(int argc, const char *const *const argv);
你现在不需要理解它们都是什么意思,只需要知道argv
是一个字符串数组,你应该永远不要修改字符串作为原始main
原型(prototype)似乎信任你。现在,知道参数从 argv[1]
开始,您的代码...
for(i=0;i<argc-1;i++)
表示:“对于从 0 到 argc - 1
范围内的每个 i
”。
printf("%s",*argv[i]);
表示:“打印 argv
的第 i
个元素的第一个字符”。为什么这是错误的?首先,您要打印一个 char
,并告诉 printf
它是一个字符串。 这有未定义的行为。然后,您将迭代 argv
的第一个 i
元素。这意味着第一个“非参数”元素将包含在混合中,而最后一个参数不会。要解决它,请写一些像...
for(i = 1; i < argc; i++)
表示:“对于从 1
到 argc
范围内的每个 i
”。
printf("%s", argv[i]);
表示:“将 argv
的第 i
元素打印到 stdout
上。
关于c - 如何从 C 中的主函数打印 argv 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860794/
目前我正在学习 C 并试图理解这些说明。它们真的不同吗? ++*argv *argv++ *(++argv) *(argv++) 谢谢! 最佳答案 后缀递增运算符的优先级高于指针取消引用运算符,而不是
我正在与在 Hostgator 共享主机上运行的 PHP CLI 的一个(也许)简单问题作斗争。一个简单的代码: 在我的本地机器上运行时以及其他几个 php 实例: php test.php arg
谁能解释一下原因 int main(int argc, const char * argv[]) { while (* argv) puts(* argv++); return 0 ;
从 K&R 的 C 书的第 5.10 章开始,argv 的概念被引入以允许命令行参数。 argv 是指向字符指针数组的指针。据此,以下代码如何检查提供的参数是否以连字符开头? (*++argv)[0]
我不明白 sys.argv 和 argv 之间的区别,网上没有任何东西给我我理解的概念。如果两者相同!我们什么时候使用 sys.argv 什么时候使用 argv ? 如果不是,sys.argv 是什么
我正在编写一个接受参数的 C 程序,char *argv[] 来决定运行哪个 exec()。我有 execlp(argv[1], argv[1], NULL) 可以正常工作。出于某种原因,execvp
char** argv 和 char* argv[] 有什么区别?在 int main(int argc, char** argv) 和 int main(int argc, char* argv[]
我目前有一个 python 脚本,可以在大型网络中完成一项非常有用的任务。我所做的是使用 lsof -iTCP -F 和其他一些选项来转储所有监听的 TCP 套接字。我能够得到 argv[0],这不是
为什么 argvs 的行为很奇怪?示例: 这将按预期工作,打印第一个参数的第一个字符。 printf("%c", *argv[1]); 但是,这将打印 ascii 表中的字符(又名“更大”,表示为数字
我做了一个小的重复异或加密器。您可以使用您选择的键对您选择的字符串进行异或运算,它可以选择将其输出到文件中。 无论何时使用单个单词(无空格)字符串和键运行程序,都没有问题。但是,只要字符串或键中有空格
我刚开始学习 C,想知道我应该在我的主要方法中使用其中的哪一个。有什么不同吗?哪个更常见? 最佳答案 由于您刚开始学习 C,我建议您首先真正尝试了解数组和指针之间的区别,而不是共同的东西。 在参数和数
所以我在编译器转换的函数中传递数组时在幕后阅读过 int myArray(int arr[]) 进入 int myArray(int *arr) 例如,大多数时候数组也会衰减为指针 arr[0] 与相
我正在编写一个小的 shell 程序,它接受一个命令并执行它。如果用户输入无效命令,则 if 语句返回 -1。如果命令正确,它就会执行命令,但是一旦它执行了命令,程序就会结束。我做错了什么是不执行它之
是否可以传入自定义参数列表? 与现实生活中的用例相比,更多是出于好奇,但例如,我可能希望在让 argparse 完成其工作之前将所有参数转换为小写。 最佳答案 Yes .只需传入要parse_args
我知道这个问题很基础,我也是新手,所以请帮我解决这个问题: 我有这个代码: int wmain(int argc, wchar_t *argv[]) { if (*argv[1] == L'-
这个问题在这里已经有了答案: Understanding slicing (38 个答案) 关闭 3 个月前。 我写了这段代码: #!/usr/bin/env python import sys i
我的程序获取主要参数,我的任务是检查用户是否在执行文件和参数之间输入了空格。 这是一个没有在 argv[0] 为 HW01 和 argv[1] 之间输入空格的人的例子/n: HW01/n 但是如果有人
我的 c 技能很生疏,所以如果这是一个愚蠢的问题,我深表歉意,但我什至没想过要寻找这个简单问题的答案。此代码编译时没有任何警告: #include int run_script( int argc,
这个问题在这里已经有了答案: Should I use char** argv or char* argv[]? (10 个答案) What does the 'array name' mean i
我有以下代码片段: int main(int argc, char *argv[]) { char line[MAXLINE]; long lineno = 0; i
我是一名优秀的程序员,十分优秀!