0

C言語の文字列を逆にしたい。私はちょっと新しいので、助けと説明をもらいたいです。なぜ私のソリューションが機能しないのですか?

#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=0;
  if (NULL == str || len == 1) return str;
  for (j = len+1 ; j > 0 ; j-- ) {
    p[j]=*q;
    q++;
  }
  return p;
}

int main(int argc, char **argv){
  char *t = argv[1];
  char *p ;
  printf("%s",t);
  p=rev(t);
  printf("%s",p);
  getchar();
  return 0;
}

動いていない :(

4

3 に答える 3

3

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
$

プログラムは、テキストと空の文字列で正常に動作します。引数が与えられない場合、それは静かに何もしません。

于 2012-07-19T02:10:05.120 に答える
2

境界でのインデックスに注意する必要があります。

for修正する1つの方法は、行を次のように置き換えることです。

for (j = len-1; j >= 0 ; j-- )
于 2012-07-19T02:04:12.970 に答える
0

リストの半分以上を反復処理し(切り捨て、奇数の長さの文字列の場合、中央の文字を元に戻すことはできません)、一時変数を介してスワップする必要があります。

一時変数を使用していないため、文字列の半分以上を書き込んでいます。次のようなものを試してください:

for( j = 0; j < len / 2; ++j ) {
    char tmp = p[ j ];
    p[ j ] = p[ len - j - 1 ];
    p[ len - j - 1 ] = tmp;
}

編集:これはその場でそれを行います。別のバッファでそれを行っている場合は、p [len]=0を追加する必要があります。

于 2012-07-19T02:06:25.527 に答える