【问题标题】:Checking whether the input word is a palindrome检查输入单词是否为回文
【发布时间】:2016-04-19 19:29:28
【问题描述】:

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

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)

【问题讨论】:

标签: c


【解决方案1】:

您不需要 strrev 甚至不需要复制内存。 以下代码是您问题的更简单和直接的答案。 请注意,此代码假定 NULL 和 "" 都不是回文。 如果传递的字符串是回文,则该函数返回 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;
}

【讨论】:

    【解决方案2】:

    您在 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;
    }
    

    【讨论】:

    • 错误的 API,就地修改字符串。
    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 2013-03-29
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多