1

このコードでは、関数を使用して文字列を逆にしようとしています。ここでは、ポインタの配列を使用していくつかの配列を格納しています。*(*(string+i)+j)この行は機能しますが、増加するとi=0すぐにセグメンテーション違反が発生します。何が問題なのか理解できません。ii=1

#include<stdio.h>
#include<string.h>
char**reverse(char**);
int main()
{
    char *final[2],*s[] = {
      "To err is human...",
      "But to really mess things up...",
      "One needs to know C!!"
      } ;
    int i;
    for(i=0;i<=2;i++)
        puts(s[i]);
    reverse(s);
    for(i=0;i<=2;i++)
        puts(final[i]);
    return 0;
}
char** reverse(char*string[2])
{   
    char *temp[2];
    int len,i,j,k;
    for(i=0;i<=2;i++)
    {
        len=strlen(string[i]);
        k=0;
        for(j=len-1;j>=0;j--)
        {   
            *(*(temp+i)+k)=*(*(string+i)+j);
            /*this line work for i=0 but give segmentation fault for i=1;*/

            printf("%c",*(*(temp+i)+k));
            k++;
        }
        printf("\n");

    }
    return temp;
}
4

4 に答える 4

3

ここにはかなりの問題があります:

  1. temp のポインターは初期化されておらず、temp はローカル スタック配列です。対象外となりますので返品はできません。

  2. 「reverse」の戻り値で何もしていません

  3. 初期配列はサイズ 2 ではなく、サイズ 3 です。

  4. 紛らわしい (*(string+i)+j) 表記を使用する必要はありません。string[i][j] も同様に機能し、はるかに読みやすくなります。

  5. 文字列を逆にした後、文字列を終了しません。temp[i][k]='\0'; が必要です。これを行うための for ループの後。

必要な結果を得るためにコードを修正する最も簡単な方法は、おそらく次のようなものです。

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

char**reverse(char**);

int main()
{
    char **final,*s[] = {
    "To err is human...",
    "But to really mess things up...",
    "One needs to know C!!"
    } ;
    int i;
    for(i=0;i<=2;i++)
    puts(s[i]);
    final = reverse(s);
    for(i=0;i<=2;i++)
    puts(final[i]);
    return 0;
}

char**reverse(char*string[3])
{
    char **temp = malloc(sizeof(char*) * 2);
    int len,i,j,k;

    for (int i=0; i < 3; i++)
    {
        temp[i] = malloc(sizeof(char) * 512);
    }

    for(i=0;i<=2;i++)   
    {
        len=strlen(string[i]);
        k=0;
        for(j=len-1;j>=0;j--)
        {   
            *(*(temp+i)+k)=*(*(string+i)+j);
            printf("%c",*(*(temp+i)+k));
            k++;
        }
        temp[i][k]='\0';
        printf("\n");
    }
    return temp;
}

プログラムの出力は次のとおりです。

過ちを犯すのは人間...

しかし、本当に物事を台無しにするために...

Cを知る必要があります!!

...namuh si rre oT

...pu sgniht ssem yllaer ot tuB

!!C wonk ot sdeen enO

于 2013-10-30T07:39:10.133 に答える
1

変数char *temp[2];は宣言されていますが、(malloc などを使用して) メモリが割り当てられることはありません。したがって、メモリの未定義の場所を指しています。これがセグメンテーション違反を引き起こしていると思います。

i = 0 で機能するのはおそらく運です:o つまり、temp[0] には有効なメモリを指す可能性のある char* が含まれていますが、temp[1] はそうではない可能性があります (seg fault)。使用する前にメモリを割り当てる必要があります。

temp[i] = malloc(strlen(string[i]));

とか、こういうことか……。

于 2013-10-30T07:38:11.633 に答える
0

final は「char * final[2]」タイプですが、ループは

for(i=0;i<=2;i++)
    puts(final[i]);

それは私に3を与えます。

于 2013-10-30T07:37:59.170 に答える
0

以下のようにコードを変更しました。コードを実行したところ、動作しました。これがお役に立てば幸いです。

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

void reverse(char**);

int main()
{
    char *s[] = {
      "To err is human...",
      "But to really mess things up...",
      "One needs to know C!!"
      } ;
    int i;

    for(i=0;i<=2;i++)
        puts(s[i]);
    //reverse the string!
    reverse(s);
    for(i=0;i<=2;i++)
        puts(s[i]);

    return 0;
}

//function to reverse the string
void reverse(char*string[2])
{   
    char *temp;
    int len,i,j,k;
    for(i=0;i<=2;i++)
    {
        len=strlen(string[i]);
        k=0;
        temp = (char *)malloc((len * sizeof(char)) + 1);
        for(j=len-1;j>=0;j--)
        {   
            temp[k] = string[i][j];
            printf("%c",temp[k]);
            k++;
        }
        temp[k] = '\0';
        //puts(temp[i]);
        string[i] = temp;  // after reversing the string store it back to string!
        printf("\n");

    }
}
于 2013-10-30T08:06:49.790 に答える