我正在尝试使用数组指针编写一个程序...
如果标题值相同,我的目标是打印错误消息。将通过命令行参数获取标题值。
如果我得到相同的标题值, 即)(GET和GET)或(HEAD和HEAD),它应该打印有效,对于所有其他情况,它应该打印无效。
我写的程序打印所有组合无效。我不明白我在哪里弄错了。
int main(int argc,char *argv[])
{
char *str1[4] = { "GET","HEAD","POST","OPTIONS"};
char *str2[2] = {NULL};
char *string = argv[1];
const char s[2] = ",";
char *token = "";
int i = 0,j = 0,k = 0,l = 0,m = 0;
token = strtok(string, s);
while( token != NULL )
{
if(i < 2)
{
str2[i] = token;
//printf( " %s\n", token );
printf("str2[%d]= %s\n",i,str2[i]);
}
i++;
token = strtok(NULL, s);
}
for(l = 0;l < 4;l++)
printf("str1[%d] = %s\n",l,str1[l]);
for( m = 0; m < 2;m++)
printf("str2[%d] = %s\n",m,str2[m]);
for(j = 0; j < 4;j++)
{
for(k =0; k < 2;k++)
{
if(str2[k] != str1[j])
printf("Invalid :: %s and %s\n",str2[k],str1[j]);
else
printf("Valid :: %s and %s\n",str2[k],str1[j]);
}
}
return 0;
}
编译代码并获得像这样的输出
bash-3.2$ gcc -o arraypointer arraypointer.c
bash-3.2$ ./arraypointer GET,HEAD
str2[0]= GET
str2[1]= HEAD
str1[0] = GET
str1[1] = HEAD
str1[2] = POST
str1[3] = OPTIONS
str2[0] = GET
str2[1] = HEAD
Invalid :: GET and GET
Invalid :: HEAD and GET
Invalid :: GET and HEAD
Invalid :: HEAD and HEAD
Invalid :: GET and POST
Invalid :: HEAD and POST
Invalid :: GET and OPTIONS
Invalid :: HEAD and OPTIONS
但预期的输出是
如果我得到相同的标题值((GET和GET)或(HEAD和HEAD),它应该打印有效。但是它的打印无效。
有人可以帮助我解决这个问题吗?
答案 0 :(得分:6)
使用strcmp
比较字符串而不是比较指针。指针只有在指向同一地址时才相等。
答案 1 :(得分:2)
您正在比较
中两个指针的值 if(str2[k] != str1[j])
其中,在你的程序中永远不会因为它们具有不同的值而被假,它们指向不同的字符串(有时会碰巧具有相同的值)。
您希望根据内容比较字符串,为此,您可以使用strcmp
,如下所示:
if(strcmp(str2[k], str1[j]))
答案 2 :(得分:2)
在此if语句中
if(str2[k] != str1[j])
在argv[1]
中比较了str1
中的标记(其第一个字符)的地址与数组strcmp
中字符串文字的地址。很明显,它们的地址不同,因为它们位于不同的存储位置。
不是比较地址,而是将标记本身作为字符串进行比较。要执行此任务,请使用标头<string.h>
中声明的标准C函数if( strcmp( str2[k], str1[j] ) != 0 )
//...
。例如
token
考虑使用字符串文字
初始化令牌char *token = "";
char *token;
没有意义。您可以将指针声明为
char *token = NULL;
或喜欢
Integer
命令行参数也可以包含少于两个令牌。在这种情况下,您的程序将具有未定义的行为。