calloc
まず、結果バッファーの最後にゼロがあることを確認するために賢く使用しました。
しかし、それはまた最初にゼロを置きます!
ループの終了条件はj > 0
、結果のスロット0を埋めなかったことを意味していました。
したがって、を印刷しようとするとp
、それが指すバッファの最初の文字には\0
、文字列の終わりを示す--が含まれるため、結果は常に空の文字列になります。
http://codepad.org/QppfYQkmで少し「修正」を行いました(フォーマットは変更せず、引数をハードコーディングして自己完結型にしました)。
余談ですが、のチェックを削除しましたif (len == 1) return str
。こんなことしないで!1文字の文字列がある場合は、引数を保持していたものと同じバッファが返されます。つまり、その結果を変更すると、入力が破棄されます。これらのバッファは別々にしてください。
あなたは本当に近かった。:)
補遺
コマンドライン引数を使用したコードは次のとおりです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
char *rev(char *str) {
char *q = str;
int len = strlen(str);
char *p = (char*)calloc(len + 1, sizeof(char));
int j;
if (NULL == str) return NULL;
for (j = len-1 ; j >= 0 ; j--) {
p[j] = *q;
q++;
}
return p;
}
int main(int argc, char **argv) {
if (argc > 1) {
char *t = argv[1];
char *p ;
printf("%s\n",t);
p = rev(t);
printf("%s\n",p);
return 0;
}
}
私がそれを実行するとき:
$ gcc rev.c && ./a.out "hello there, reverse me"
hello there, reverse me
em esrever ,ereht olleh
$ gcc rev.c && ./a.out ""
$ gcc rev.c && ./a.out
$
プログラムは、テキストと空の文字列で正常に動作します。引数が与えられない場合、それは静かに何もしません。