比较数组指针时出现问题

时间:2016-09-09 12:07:25

标签: c

我正在尝试使用数组指针编写一个程序...

如果标题值相同,我的目标是打印错误消息。将通过命令行参数获取标题值。

如果我得到相同的标题值,     即)(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),它应该打印有效。但是它的打印无效。

有人可以帮助我解决这个问题吗?

3 个答案:

答案 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

命令行参数也可以包含少于两个令牌。在这种情况下,您的程序将具有未定义的行为。