是否可以通过scanf向main添加参数?

是否可以通过scanf向main添加参数?,c,C,我试图通过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){

我试图通过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;
}
#包括
#包括
int main(int argc,char*argv[]){
/*检查是否没有参数,即argc!=2*/
如果(argc!=2){
puts(“请输入参数:”);
scanf(“%s”和&argv[1]);
printf(“\n您已输入参数:%s\n”,argv[1]);
返回1;
}
printf(“\n您已输入参数:%s\n”,argv[1]);
返回0;
}

scanf中的
%s
说明符要求您传入一个指针,该指针指向已分配的空间,并且足够大,可以容纳将要读取的内容

而是传入一个指针,该指针指向存储另一个指针的区域。这会导致未定义的行为,因为传入的指针类型错误

无法扩展
argv
数组的长度。其实,


相反,您应该只读取
main

中的一个变量,当用户输入参数时,Argv由系统分配。如果没有参数,则不能使用该数组上的位置1。虽然,正如评论中指出的,您不应该按照自己愿意的方式来做,但是如果您声明自己的局部变量,您可以扫描参数。

是的,代码可以有效地添加参数

“参数argc和argv以及argv数组指向的字符串应由程序修改,并在程序启动和程序终止之间保留其最后存储的值。”C11dr§5.1.2.2.1 2

因此,这允许代码更改
argc
argv
,并更改
argv[0][0]
(如果
argc>0
)-但是等等,还有更多

代码能否更改
argv[]
的原始元素,如
argv[1]
等?这是一个悬而未决的问题。因此,让我们避免这种情况

更改
argv[]
内容的方法是首先创建一个备用集
argv\u alt[]
数组,然后分配
argv\u 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;
}
#包括
int main(int argc,char*argv[]){
//假设argc==1
printf(“%d'%s'\n”,argc,argv[0]);
字符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]);
返回0;
}

不,您不能这样做。正常的验证实践是,如果缺少参数,则打印一条带有参数定义的“用法”消息并退出。您需要使用局部变量,如果
argc<2
则无法写入
argv[1]
单独的问题:当对字符串使用scanf时,您不需要&如果您正在传递字符串的地址。@samgak在这个代码
argv[1]
中是
char*
,而不是字符串如果您有一个合适的POSIX-2008兼容版本的
scanf()
,您可以使用
scanf(“%ms”,&argv[1])
;否则,
&argv[1]
不正确。如果用户提供了两个以上的参数,您可能不应该尝试读取参数。您可以分配内存并将其传递给
scanf()
,然后将
argv[1]
设置为指向该内存——只要
argc
至少是一个(正常情况下是这样),因为
argv[argc]
存在并包含空指针,那么它甚至是安全的。但是,参数列表将不再以空指针终止;小心那些期望它是正确的代码。