无法将两个char数组相互比较

时间:2015-10-30 18:25:20

标签: c

我有一个反向函数,我想用它来比较两个字符串,但它似乎没有用。我认为每次迭代字符串时,每次都会覆盖该值。我认为它需要存储在一个单独的数组中,以便能够相互评估两者。这就是我到目前为止所拥有的:

int compare_strings(char [], char []);

char* reverse(char* str)
{
    int i, j;
    char temp;
    i=j=temp=0;

    j=strlen(str)-1;
    for (i=0; i<j; i++, j--)
    {
        temp=str[i];
        str[i]=str[j];
        str[j]=temp;
    }
    return str;
}
int main(int argc, char* argv []) {
    char word[100];
    char const* const fileName = argv[1];
    FILE *file = fopen(fileName,"r");
    char s[100];
    char formattedWord[100];
    while(fgets(word, 100, file)!=NULL){
        memset(s,'\0',sizeof s);
        char *token=strtok(word," ");
        while(token!=NULL){
            size_t n=strlen(s);
            sprintf(&s[n],"%s",token);
            token=strtok(NULL," ");

        }
        if (reverse(s) == s)
            {
                printf("%s\n", reverse(s));
            }    
        }
    fclose(file);

    return 0;
}

2 个答案:

答案 0 :(得分:4)

您无法if (reverse(s) == s),因为这只会比较指针值。您必须使用诸如strcmp之类的库函数,或者遍历每个字符并进行比较。

这样的事情是有效的。

char *reverse_s = reverse(s);
if(!strcmp(reverse_s, s)) {
  printf("%s\n", reverse_s);
}

答案 1 :(得分:2)

有三个问题。首先是:

if (reverse(s) == s)

这不是你比较两个字符串的方式。您改为调用strcmp,如果返回0,则两个字符串相同。

但是,reverse函数会将字符串反转到位。所以无论采用哪种方法,结果都将是真实的。

reverse内,你想分配新内存并在那里写反向字符串,然后返回那个新字符串。

char* reverse(char* str)
{
    int i, j;
    char *temp;
    i=j=0;

    temp = malloc(strlen(str) + 1);
    j=strlen(str)-1;
    for (i=0; j>=0; i++, j--)
    {
        temp[j]=str[i];
    }
    temp[strlen(str)] = '\0';
    return temp;
}

现在,当您致电reverse时,您需要保存返回值,以便以后可以free该内存。

    char *s2;
    ...
    s2 = reverse(s);
    if (!strcmp(s,s2))
        {
            printf("%s\n", s2);
        }
    free(s2);

最后,如果有足够的空间,fgets会在字符串的末尾添加换行符。因此,在标记字符串时需要考虑到这一点:

    char *token=strtok(word," \n");
    while(token!=NULL){
        size_t n=strlen(s);
        sprintf(&s[n],"%s",token);
        token=strtok(NULL," \n");
    }