我在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;,有人给我一些提示吗?
答案 0 :(得分:4)
您在这里实际做的是将"xx"
分配给argv[i]
,然后分支该分配的结果。这是因为=
运算符用于赋值。当测试(即比较)一个值时,您需要使用运算符进行相等,即==
。
此外,无论如何都不能以这种方式比较字符串,因为它们不是主要数据类型,因为它们在某些其他语言中。如果您尝试if (argv[i] == "xx")
,那么您将比较每个字符串的第一个字符的地址,这仍然是错误的!
为了解决这个问题,我们可以使用strcmp()
函数来比较两个字符串的内容,如果字符串不同则返回非零结果。 strcmp()
函数由string.h
头文件提供。
为了达到预期的效果,请在文件顶部添加#include <string.h>
并使用if (strcmp(argv[i], "xx") == 0)
。
有关strcmp()
答案 1 :(得分:1)
if (argv[i] = "xx")
的两个问题:
您正在使用赋值运算符,它使argv[i]
指向字符串文字"xx"
。由于字符串文字的地址始终为非NULL
,因此条件始终为真。
您可能想要使用等于运算符==
。但它仍然无法奏效。见下面的第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)你必须使用一个字符串比较函数(==对它不起作用)