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