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

时间:2015-06-18 01:03:45

标签: 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){

        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;
}

3 个答案:

答案 0 :(得分:2)

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

  

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

因此,这允许代码更改argcargv并更改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。虽然正如评论所指出的那样,你不应该按照自己的意愿行事,但如果你声明自己的局部变量,你可以扫描参数。