检查输入字是否是回文

时间:2016-01-14 12:53:02

标签: c

您好我在尝试编译代码时遇到错误。

int main()
{

char string_buffer[20], string_buffer1[20];//which is going to be copied into and reversed.

printf("Enter the string to check if it is a palindrome\n");
scanf("%20s", string_buffer);

strcpy(string_buffer1,string_buffer);//copying string_buffer into string_buffer1
strrev(string_buffer1);//reverse string_buffer1

if (strcmp(string_buffer,string_buffer1) == 0){//check to see if they are the same
    printf("Palindrome.\n");

}else{
    printf("Not a palindrome.\n");

}       
    return 0;

}

当我尝试编译时,我收到此警告和错误。

palindrome.c:12:2: warning: implicit declaration of function 'strrev' is invalid
      in C99 [-Wimplicit-function-declaration]
        strrev(string_buffer1);//reverse string_buffer1
        ^
1 warning generated.
/tmp/palindrome-1efe10.o: In function `main':
palindrome.c:(.text+0x68): undefined reference to `strrev'
clang-3.5: error: linker command failed with exit code 1 (use -v to see invocation)

2 个答案:

答案 0 :(得分:1)

你在linux中没有strrev,使用其中一个替代方案(取自here):

#include <string.h>

char *strrev(char *str)
{
      char *p1, *p2;

      if (! str || ! *str)
            return str;
      for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
      {
            *p1 ^= *p2;
            *p2 ^= *p1;
            *p1 ^= *p2;
      }
      return str;
}

答案 1 :(得分:0)

您不需要strrev甚至不需要复制内存。 以下代码更简单,更直接地回答您的问题。 请注意,此代码假定NULL和“”都不是palindroms。 如果传递的字符串是回文,则函数返回1,否则返回0。

int is_palindrome(const char *str)
{
    size_t len = str ? strlen(str) : 0;
    const char *p;

    if (len < 1)
            return 0;

    for (p = str + len - 1; str < p; str++, p--)
            if (*p != *str)
                    return 0;
    return 1;
}