そこにはかなりの問題があります。getReverse()
1 つ目は、 で使用する場合のスコープにプロトタイプがないことですmain()
。プロトタイプを提供するか、それを認識getReverse()
できるように上に移動する必要があります。main()
main()
2 つ目は、すべての文字が入力された後に文字列を逆にしようとしており、入力方法が正しくないという事実です (c
文字を取得する前に不確定要素をチェックします)。次のようなものの方が良いでしょう:
count = 0;
c = getchar();
while (c != EOF) {
arr[count++] = c;
c = getchar();
}
arr[count] = '\0';
これにより、末尾に改行があるにもかかわらず、適切な C 文字列が得られます。また、仕様に一致しない複数行の文字列でさえある可能性があります (「標準入力から 1 行の文字を読み取る」)。改行またはファイルの終わりで入力を終了させたい場合は、代わりにこれを使用できます。
count = 0;
c = getchar();
while ((c != '\n') && (c != EOF)) {
arr[count++] = c;
c = getchar();
}
arr[count] = '\0';
さらに、可能なすべての文字とマーカーを格納できる必要があるため、c
実際にはint
ではなく である必要があります。char
EOF
関数getReverse()
にも問題があります。主に、配列の最後に文字列終了マーカーを配置していないという事実だけでなく、間違ったサイズを使用しているため (sizeof
ではなく) 、ループを介して毎回strlen
再初期化するように見えるためです。j
. いずれにせよ、大幅に単純化できます。
void getReverse (char *dest, char *src) {
int i = strlen(src) - 1, j = 0;
while (i >= 0) {
dest[j] = src[i];
j++;
i--;
}
dest[j] = '\0';
}
または、熟練したコーダーになったら:
void getReverse (char *dest, char *src) {
int i = strlen(src) - 1, j = 0;
while (i >= 0)
dest[j++] = src[i--];
dest[j] = '\0';
}
各行の文字を反転させるメイン プログラムが必要な場合は、次のようにして実行できます。
int main (void) {
int count;
int MAX_SIZE = 20;
int c;
char arr[MAX_SIZE];
char revArr[MAX_SIZE];
c = getchar();
count = 0;
while(c != EOF) {
if (c != '\n') {
arr[count++] = c;
c = getchar();
continue;
}
arr[count] = '\0';
getReverse(revArr, arr);
printf("'%s' => '%s'\n", arr, revArr);
count = 0;
c = getchar();
}
return 0;
}
サンプルの実行では、次のことが示されます。
pax> ./testprog
hello
'hello' => 'olleh'
goodbye
'goodbye' => 'eybdoog'
a man a plan a canal panama
'a man a plan a canal panama' => 'amanap lanac a nalp a nam a'