argv输出错误?

时间:2017-04-14 08:19:11

标签: c string argv

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

Add

我用以下代码编译并运行此代码:

#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

我不知道为什么输出总是出现&#34; xx&#34;,有人给我一些提示吗?

4 个答案:

答案 0 :(得分:4)

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

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

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

为了达到预期的效果,请在文件顶部添加#include <string.h>并使用if (strcmp(argv[i], "xx") == 0)

有关strcmp()

的详情,请参阅this Tutorials Point page

答案 1 :(得分:1)

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

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

    您可能想要使用等于运算符==。但它仍然无法奏效。见下面的第2点。

  2. 使用==,检查argv[i][0]的内存位置是否与"xx"的第一个字符的内存位置相同(这是由于数组“衰减”,谷歌一下)。这不是你想要的。

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

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

答案 2 :(得分:1)

在本声明中

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

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

但是如果你要写

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

然后将比较两个地址:相应的用户提供的参数的地址和字符串文字的地址(它们的第一个字符的地址)。结果表达式总是会产生错误。

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

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

答案 3 :(得分:0)

a)因为=没有比较而是作业

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