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 - 11

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 に答える