C で文字列を逆にしようとしています。reverse 関数は、(for ループ内の) 特定の場所にある文字を一時オブジェクトに割り当てるだけです。プログラム内に論理エラーは見られず、プログラムは次のコマンドを使用して gcc 4.7.2 で正常にコンパイルされます。
gcc -Wall -std=c99 reverse.c
問題を再現するには:
1.) プログラムを実行し、シェルに文字列を入力します
2.) 入力が完了したら、enter/and または EOF シグナルを押します。
問題は、元の文字列も逆文字列も印刷されないことです。これは、K&R 第 2 版の演習でもあります。この演習を完了している場合は、私のソリューションとは別のソリューションを提供していただければ幸いです。
このバグは null 文字がないことが原因だと思います。有名な printf では、入力を cin に出力するために null で終了する文字列が必要です。getline 関数は、null 文字を配列の最後に割り当てます。確実に null 文字は文字列の最初の文字になり、printf が終了します (したがって、文字/リテラルは出力されません)。
#include <stdio.h>
#define MAXLINE 1000
int geline(char s[], int lim);
void reverse(char line[], int length);
int main()
{
char s[MAXLINE];
char t[MAXLINE];
int k, len;
while ((len = getline(s, MAXLINE)) > 0) {
if (len > 1)
reverse(s, len);
}
printf("%s", s);
return 0;
}
void reverse (char input[], int length)
{
char temp[MAXLINE];
int j = length;
for (int i = 0; i < length; ++i, --j) {
temp[i] = input[i];
input[i] = input[j];
input[j] = temp;
}
}
int getline(char s[], int lim)
{
int c, i;
for (i=0; (c=getchar()) != EOF && c!='\n'; ++i)
s[i] = c;
if (c== '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}