argv 输出错误?

Wrong output of argv?

我在 Ubuntu14 中使用 gcc。这是我的代码:(test.c)

#include <stdio.h>
int main(int argc, char *argv[]){
int i=0;
for(i=1; i <argc;i++)
{
    if (argv[i] = "xx") {
       printf("I got you!\n");
    }
printf("%d %s\n",i, argv[i]);   
}
return 0;
}

我编译并运行这段代码:

gcc test.c -o test

./test aa bb xx

我希望输出是

1 aa
2 bb
I got you!
3 xx

但结果是

I got you! 
1 xx
I got you! 
2 xx
I got you! 
3 xx

即使我使用 ./test aa bb 输出也是

I got you! 
1 xx
I got you! 
2 xx

我不知道为什么输出总是"xx",有没有人给我一些提示,好吗?

a) 因为 = 不做比较而是赋值

b)你必须使用字符串比较函数(== 对它也不起作用)

您实际上在这里做的是将 "xx" 分配给 argv[i],然后在该分配的 结果 上分支。这是因为 = 运算符用于赋值。当testing(即comparing)一个值时需要使用相等运算符,即==

此外,字符串无论如何也不能以这种方式进行比较,因为它们不像在其他一些语言中那样是主要数据类型。如果你尝试 if (argv[i] == "xx") 你会比较每个字符串的第一个字符的地址,这仍然是错误的!

为了解决这个问题,我们可以使用 strcmp() 函数来比较两个字符串的内容,如果字符串不同,returns 则返回非零结果。 strcmp() 函数由 string.h 头文件提供。

因此,要获得预期结果,请在文件顶部添加 #include <string.h> 并使用 if (strcmp(argv[i], "xx") == 0)

有关 strcmp()

的更多信息,请参见 this Tutorials Point page

if (argv[i] = "xx") 的两个问题:

  1. 您正在使用赋值运算符,它使 argv[i] 指向字符串文字 "xx"。并且由于字符串文字的地址将始终为非 NULL,因此条件始终为真。

    您可能想使用相等运算符 ==。但那样还是行不通。请参阅下面的第 2 点。

  2. 使用==,检查argv[i][0]的内存位置是否与"xx"的第一个字符相同(这是由于数组"decay"、Google吧)。这不是你想要的。

    您想将 argv[i] 内容 与字符串文字进行比较。因此,使用 string.h:

    中的 strcmp
    if (strcmp(argv[i], "xx") == 0)
    

在此声明中

if (argv[i] = "xx") {
           ^^^ 

将字符串字面量"xx"的第一个字符的地址赋值给指针argv[i]。由于地址的值不等于 0,因此此表达式始终为真。

但是如果你会写

if (argv[i] == "xx") {
            ^^

然后会比较两个地址:对应的用户提供参数的地址和字符串字面量的地址(第一个字符的地址)。结果,表达式将始终为 false。

你需要的是比较这些指针指向的字符串。所以你应该写

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i = 0;

    while ( ++i < argc )
    {
        if ( strcmp( argv[i], "xx" ) == 0 ) 
        {
            printf( "I got you!\n" );
        }

        printf( "%d %s\n", i, argv[i] );   
    }

    return 0;
}