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")
的两个问题:
您正在使用赋值运算符,它使 argv[i]
指向字符串文字 "xx"
。并且由于字符串文字的地址将始终为非 NULL
,因此条件始终为真。
您可能想使用相等运算符 ==
。但那样还是行不通。请参阅下面的第 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;
}
我在 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()
if (argv[i] = "xx")
的两个问题:
您正在使用赋值运算符,它使
argv[i]
指向字符串文字"xx"
。并且由于字符串文字的地址将始终为非NULL
,因此条件始终为真。您可能想使用相等运算符
==
。但那样还是行不通。请参阅下面的第 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;
}