我试图通过scanf向main添加一个参数。但它没有用。以下是我的计划。我的问题是:这个程序有什么问题?是否可以通过scanf()而不是在命令行中向main添加参数?
#include <stdio.h>
#include <errno.h>
int main(int argc, char* argv[]){
/*check if there is no argument, that is, argc!=2*/
if(argc != 2){
puts("Please enter an argument: ");
scanf("%s", &argv[1]);
printf("\nYou've entered argument: %s\n", argv[1]);
return 1;
}
printf("\nYou've entered argument: %s\n", argv[1]);
return 0;
}
答案 0 :(得分:2)
是的,代码可以有效地添加参数。
“参数argc和argv以及argv数组指向的字符串应该可由程序修改,并在程序启动和程序终止之间保留它们最后存储的值。” C11dr§5.1.2.2.12
因此,这允许代码更改argc
和argv
并更改argv[0][0]
(如果argc > 0
) - 但等等,还有更多......
代码可以更改argv[]
的原始元素,例如argv[1]
等吗?这是一个悬而未决的问题here。所以,让我们避免这种情况。
更改argv[]
内容的方法是首先创建一个备用集argv_alt[]
数组,然后分配argv_alt --> argv
。
#include <stdio.h>
int main(int argc, char *argv[]) {
// Assume argc == 1
printf("%d '%s'\n", argc, argv[0]);
char a[3][10] = { "abc", "def", "fgh" };
char *argv_alt[] = { a[0], a[1], a[2], NULL };
argc = 3;
argv = argv_alt;
printf("%d '%s' '%s' '%s'\n", argc, argv[0], argv[1], argv[2]);
return 0;
}
答案 1 :(得分:0)
scanf中的%s
说明符期望您传入一个指针,该指针指向已经分配的空间并且足够大以容纳将要读取的内容。
而是传入一个指向存储另一个指针的区域的指针。这会导致未定义的行为,因为您传入的指针具有错误的类型。
无法扩展argv
数组的长度。实际上,writing to argv[n] probably causes undefined behaviour anyway。
相反,您应该只读入main
内的变量。
答案 2 :(得分:0)
当用户输入参数时,系统会分配Argv。如果没有参数,则无法使用该数组上的位置1。虽然正如评论所指出的那样,你不应该按照自己的意愿行事,但如果你声明自己的局部变量,你可以扫描参数。