1

我在 C 中的输出格式存在一些问题。请参阅下图了解我的输出

看图片

我希望我的输出如下

输入单词:KayaK

皮划艇是回文。

    // palindrome.c
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #define MAXLEN 20

    int isPalindrome(char [], int);

    int main(void) {
    char word[MAXLEN+1];
    int size;

    printf("Enter word: ");
    fgets(word,MAXLEN+1,stdin);
    size = strlen(word);
    if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0
   {
    printf("%s is a palindrome.\n",word);
   }
   else
   {
    printf("%s is not a palindrome.\n",word);
   }
   return 0;
   }

 int isPalindrome(char str[], int size) {
int i;
for (i = 0; i < size; i++)
{
    if (tolower(str[i]) != tolower(str[size - i - 1]))
    {
        return 0;
    }
}
return 1;
}
4

3 回答 3

8

fgets读取字符串,包括终止换行符。在进一步处理之前将其剥离。

请注意,您实际上在传递时考虑到了这一点size-1,但是出于错误的原因。它包括\n,不\0

于 2012-10-22T12:56:31.940 回答
1

您的代码掩盖了包含行尾标记的原始字符串的问题:

这条线切断了尾随的零

if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0

顺便说一句,评论是错误的:strlen不包括\0,它包括\n

\n由于再次size - i - 1减去,这一行忽略了尾随1,即使您在第一次调用函数时已经减去了它:

if (tolower(str[i]) != tolower(str[size - i - 1]))

你应该做这个:

size--;
word[size] = '\0';
if (isPalindrome(word, size-1)) //size - 1 because strlen includes \0

现在您可以按如下方式更正您的回文检查器:

if (tolower(str[i]) != tolower(str[size - i])) // No "minus one"
{
    return 0;
}
于 2012-10-22T12:58:03.583 回答
0

剥离它意味着将其从字符串中删除。

//...
printf("Enter word: ");
fgets(word,MAXLEN+1,stdin);
size = strlen(word);
word[size-1] = '\0'
//program
于 2012-10-22T13:00:57.770 回答