2

关于为什么我尝试编译代码以检查文件中的一行atadata是否收到警告的任何想法:

warning: implicit declaration of function ‘strrev’ [-Wimplicit-function-declaration]

代码

#include <stdio.h>
#include <string.h>

int main(){
    char palindromes[100];
    char reverse[100];
    FILE *atadata = fopen("atadata","r");
    while (fgets(palindromes,sizeof(palindromes),atadata) != NULL){
        strcpy(reverse,palindromes);
        strrev(reverse);
        if( strcmp(atadata,reverse) == 0)
        fputs(atadata, stdout);
    }
    fclose(atadata);
    return 0;
}
4

4 回答 4

4

如果您在 Linux 中编译,则strrev()不是string.h 的一部分。链接的问题包含一个答案,链接到实现的源代码,您可以直接将其引入自己的代码中。

于 2014-10-28T21:39:15.287 回答
3
char *strrev(char *str){
    char c, *front, *back;

    if(!str || !*str)
        return str;
    for(front=str,back=str+strlen(str)-1;front < back;front++,back--){
        c=*front;*front=*back;*back=c;
    }
    return str;
}
于 2014-10-28T21:52:38.760 回答
1

如果其他一些代码难以阅读或者您不知道如何使用指针,这里有一个简短的脚本来反转字符串。

#include <stdio.h>
#include <string.h>

int main(void)
{
// Start here
char String1[30] = "Hello",reversed[30];
int i;
long int length = strlen(String1);

//Reverse string
for(i=0; i<length; ++i)
{
    reversed[length-i-1] = String1[i];
}

printf("First string %s\n",String1);
printf("Reversed string %s\n",reversed);

// To here if you want to copy and paste into your code without making functions 
return 0;
}
于 2014-10-28T21:58:42.020 回答
0

满足您的需求并在其操作中高效的一项功能将采用以下形式:

/** strrev - reverse string, swaps src & dest each iteration.
*  Takes valid string and reverses, original is not preserved.
*  If str is valid, returns pointer to str, NULL otherwise.
*/
char *
strrev (char *str)
{
    if (!str) { 
        fprintf (stderr, "%s() Error: invalid string\n", __func__); 
        return NULL; 
    }

    char *begin = str;
    char *end = *begin ? str + strlen (str) - 1 : begin;  /* ensure non-empty */
    char tmp;

    while (end > begin)
    {
        tmp = *end;
        *end-- = *begin;
        *begin++ = tmp;
    }

    return str;
}
于 2014-10-28T21:45:51.493 回答