0
#include "usefunc.h"
#define MY_SIZE 256

int inpArr(char tmp[], int size) {
    size = -1;
    while(1) {
        size++;
        if((tmp[size] = getchar()) == '\n') break;
    }
    return size;
}

void revString(char tmp[], int size, char new[]) {
    int i, j;
    for (i = size, j = 0; i >= 0; i--, j++) new[j] = tmp[i];
}

void copy_forw(char tmp[], int size, char new[], int offset) {
    int i, j;
    for (i = offset, j = 0; i <= size; i++, j++) new[j] = tmp[i];
}

void copy_back(char tmp[], int size, char new[], int offset) {
    int i, j;
    for (i = size-offset, j = size; i > -1; i--, j--) new[j] = tmp[i];
}

void cut(char tmp[], int size, char new[]) {

}

int main () {
    char tmp[MY_SIZE] = {0x0}, rev[MY_SIZE] = {0x0}, new[MY_SIZE] = {0x0}, some[MY_SIZE-1];
    int size = inpArr(tmp, size);
    revString(tmp, size, rev);
    copy_forw(rev, size, new, 1); copy_back(tmp, size, some, 1);
    printf("|%s|\n|%s|\n", some, new);
    int is_palindrome = StringEqual(new, some);
    printf("%d\n", is_palindrome);
}

StringEqualは、char配列を文字ごとに比較するだけの関数です。
文字列を入力するyayと、回文であるはずですが、そうではないようです。どうしてこれなの?

4

2 に答える 2

4

あなたの問題は次のような線にあります:

if((tmp[size] = getchar()) == '\n') break;

この行は、ユーザーが入力の提供が完了したことを示すためにユーザーが文字を入力した場合でも、ユーザーが入力した文字を常に配列に割り当て\nます。したがって、たとえば、「yay」と入力してから、完了したことを示す改行を入力すると、配列は次のようになります。

{'y', 'a', 'y', '\n'}

その配列の逆は次のとおりです。

{'\n', 'y', 'a', 'y'}

...これは明らかに回文チェックに失敗します。次のようにコードを修正することをお勧めします。

int inpArr(char tmp[], int size) {
    size = -1;
    while(1) {
        size++;
        if((tmp[size] = getchar()) == '\n') break;
    }
    tmp[size] = '\0';  //replace the newline with a null terminator
    return size;
}

void revString(char tmp[], int size, char new[]) {
    int i, j;
    for (i = size - 1, j = 0; i >= 0; i--, j++) new[j] = tmp[i];
    new[size] = '\0';  //place a null terminator at the end of the reversed string
}
于 2011-05-15T05:35:01.473 に答える
1

行を見てください:

if((tmp[size] = getchar()) == '\n') break;

'\n'文字列の最後に常に存在します。それはあなたの問題だ。

于 2011-05-15T07:24:38.180 に答える