C编程:尝试在终端上编译主类,但它返回给我./mainT

时间:2018-03-31 18:14:11

标签: c gcc

我正在尝试从命令行参数进行输入。这是我在c

中的代码
int main(int argc,  char * argv[]) {

    int i;
    if (argc == 0)
    {
        printf("ERROR: You need an argument.\n");
        // We are out of here!
        return 1;
    }

    for( i = 0; i < argc; i += 1 )
    {
        char *pos = argv[0]; // pos is the pointer to the first position
        int possize = sizeof(argv[0]);
        for(i=0;i<possize;i++)
        {
            printf("%c",pos[i]);
        }

        printf("\n");
    }
    return 0;
}

当我试图从终端运行它时。我输入了gcc main.c -o main,然后是./main,它给了我./mainT。为什么这样做?任何人都可以帮我修理它,谢谢你。

2 个答案:

答案 0 :(得分:1)

您需要修复两个错误:

  • argv[0]不是第一个参数,它是您程序的名称。如果要打印初始命令行参数,请改用argv[i],并确保从i开始1
  • sizeof(argv[1])不会产生参数的长度;请改用strlen

答案 1 :(得分:0)

由于argv[0]始终包含您调用该程序的字符串,因此argc始终至少为1.

所以正确的版本是:

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

    int i;
    if (argc == 1)
    {
        printf("ERROR: You need an argument.\n");
        // We are out of here!
        return 1;
    }

    // loop through all arguments
    for( i = 1; i < argc; ++i )
    {
        char *pos = argv[i];
        int possize = strlen(argv[i]);  //<-- use strlen here, not sizeof
        for(i=0;i<possize;i++)
        {
            printf("%c",pos[i]);
        }

        printf("\n");
    }
    return 0;
}

另请注意,sizeof(argv[0])会返回指针的大小,而不是 字符串的长度。您需要strlen(请参阅上面的更正版本)。

在x86_64系统上,指针的大小通常为8,因此sizeof(argv[0]) 将返回8.因为您使用./main执行了该程序,该字符串 "./main"的长度为6,因此您的循环访问内存超出范围,从而产生未定义的行为。