-3

なぜ機能しないのですか?コンパイラは、ローカルアドレスを返すと言います。それを正しくする方法を助けてください。他の逆文字列プログラムを見ましたが、問題は見つかりませんでした。

#include<stdio.h>
#include<string.h>

char *reverse(char *str);

void main()
{
    char str[]="jamesbond";
    int len=strlen(str);
    char *ptr;
    ptr=reverse(str);
    printf("the reversed string is :%s",ptr);
}

char *reverse(char *str)
{ 
    int i,j;
    int len=strlen(str);
    char qtr[len];

    for( i=len-1;i<=0;i--)
    { 
        for( j=0;j<len-1;j++)
            qtr[j]=*(str+i);
    }
    return qtr;
}
4

5 に答える 5

0

最初のforループの条件を次のように変更する必要があります

i >= 0



for( i=len-1;i>=0;i--)
  { for( j=0;j<len-1;j++)
    qtr[j]=*(str+i);

   }

そして、結果の配列へのポインタを渡していないためです。

qtrのmallocを使用することをお勧めします

qtr = malloc(sizeof(strlen(str));

また

 int len=strlen(str);

main()には、不要な計算が含まれています。

于 2013-01-24T18:04:52.510 に答える
0

関数からスタック変数 (または配列) (ここでは ) を返すqtrことは未定義の動作です。上書きされます。

解決策はmalloc()配列にあり、代わりにそれを返し、それfree()を使い終わったらそれを返します。

于 2013-01-24T17:59:26.370 に答える
0

qtrはローカル配列であり、それへのポインターを返しています。そんなことはできません。動的メモリを割り当てて、それを返す必要があります。

char *qtr = malloc(len + 1);

free()いつかこのメモリが必要になることに注意してください。代わりに、その場で逆にするだけです:

char *start = str;
char *end = str + strlen(str) - 1;
char tmp;

while (start < end)
{
   tmp = *start;
   *start++ = *end;
   *end-- = tmp;
}
于 2013-01-24T17:59:38.040 に答える
0

qtr がスタックに割り当てられています。関数が戻るとすぐに範囲外になるメモリ。回避策として qtr を static として宣言できます。

于 2013-01-24T17:59:58.077 に答える
0

私はどこかでこのコードを見つけました。合法に見えます。そして、台無しにしたくない場合は、文字列を入力して、ポインター (memcpy()) をディープコピーして挿入します。

char* strrev( char* s)
  {
  char  c;
  char* s0 = s - 1;
  char* s1 = s;

  /* Find the end of the string */
  while (*s1) ++s1;

  /* Reverse it */
  while (s1-- > ++s0)
    {
    c   = *s0;
    *s0 = *s1;
    *s1 =  c;
    }

  return s;
  }
于 2013-01-24T18:33:55.943 に答える