1

文字列を交換するコードを書きましたが、交換できません。問題は何ですか?関数を使用してどのように解決できswapますか?

#include <stdio.h>

void swap( char*,char*);
int main()
{
    char *ptr[2] = {"hello", "morning"};
    swap(ptr[0], ptr[1]);
    printf("%s %s", ptr[0], ptr[1]);
    return 0;
}

void swap(char *t1, char*t2)
{
    char *t;
    t = t1;

    t1 = t2;
    t2 = t;
}

も渡そうとしましたが(&ptr[0], &ptr[1])、ここではsegmentation fault. また、 char を作成し、 、 、およびに*p1 = ptr[0], char *p1 = ptr[1]渡しますが、それでもセグメンテーション違反が発生します。&p1&p2swap

4

4 に答える 4

8

C 関数の引数は値渡しです。アドレスの値を関数に渡し、swapそれらの値 (アドレス) が変更されることを期待しています。ただし、関数内のアドレスのコピーswapのみが変更されます。

実際に渡されたアドレスを変更するには、追加のレベルの参照が必要になります。

void swap(char **t1, char **t2)
{
    char *t;

    t = *t1;
    *t1= *t2;
    *t2 = t;
}

そして、これを次swapのように呼び出します。swap(&ptr[0], &ptr[1]);

于 2012-07-28T19:16:02.197 に答える
6

それらを切り替えるには、char 配列のポインターへのポインターを渡す必要があります。そうすることで、代わりにこれらのポインターの値を交換できます。(これは実際の配列です。)

#include<stdio.h>
void swap( char**,char**);
int main()
{
        char *ptr[2] = {"hello","mornig"};
        swap(&ptr[0], &ptr[1]);
        printf("%s %s",ptr[0], ptr[1]);
        return 0;
}

void swap( char **t1,char **t2)
{
        char *t;
        t = *t1;

        *t1 = *t2;
        *t2 =t;
}
于 2012-07-28T19:15:59.743 に答える
3

文字列を交換するには、文字列へのポインターを渡す必要があります (char**)。そうしないと、行った変更は swap 関数に対してローカルになります。

void swap( char **t1,char **t2)
{
        char *t;
        t = *t1;

        *t1 = *t2;
        *t2 =t;
}

int main()
{
        char *ptr[2] = {"hello","mornig"};
        swap(&ptr[0], &ptr[1]);
        printf("%s %s",ptr[0],ptr[1]);
        return 0;
}
于 2012-07-28T19:15:30.803 に答える
1

char *ptr[2] = {"hello","mornig"};- このステートメントは、2 つの文字列 (つまり ) のアドレスを格納するサイズ 2 の配列を割り当てていることを意味しますchar *。あなたが与えている2つの文字列text segmentは、読み取り専用データです。それを変更しようとすると、クラッシュ (sgmentation fault) につながります。

したがって、呼び出すとswap(&ptr[0], &ptr[1])クラッシュにつながります。m最初の読み取り専用文字列に文字を書き込もうとしているためですh。にある文字列には書き込みできませんtext segment

単純に文字列を交換したい場合は、関数を として呼び出すことができます。swap(&ptr[0], &ptr[1])これは と同等swap((ptr + 0),(ptr + 1));です。

そして swap 関数を以下のように変更します

void swap( char **t1,char **t2)
{
        char *t;

        t = *t1;
        *t1 = *t2;
        *t2 =t;
}

ここでは、配列ポインタに格納されている文字列のアドレスを交換しているだけptrです。

于 2012-07-29T06:59:05.387 に答える