1

strcpyを使用する前にメモリを割り当てているにもかかわらず、 char ポインターが指すコンテンツを別のポインターにコピーする際に問題が発生しています。strdupでいくつかの提案を見てきましたが、それを必要とせずに何をすべきか知りたいです。これが私のメインコードです

int main (void)
{
    char word[20];
    leaftype destiny;
    while(1)
    {
        printf("\nType in a word: ");
        scanf("%s",word);
        copy_leaf(&destiny,palavra);
        if (palavra[0] == '0') break;
    }

    system("pause");

    return 0;
}

私が持っている問題は、関数 copy_leaf にあります。

void copy_leaf(leaftype* destiny, leaftype source)
{
    printf("\n====start of copy_leaf======\n");
    int i;
    printf("strlen of source: %d",strlen(source));
    printf("\nsource: ");
    for(i = 0; i <= strlen(source); i++)
    {
        if(i == strlen(source))
        {
            printf("\\0");
        }
        else printf("%c-",source[i]);
    }
    *destiny = malloc((strlen(source)+1)*sizeof(char));
    strcpy(*destiny,source);
    printf("\nstrlen of destiny: %d",strlen(*destiny));
    printf("\ndestiny: ");
    for(i = 0; i <= strlen(*destiny); i++)
    {
        if(i == strlen(*destiny))
        {
        printf("\\0");
        }
        else printf("%c-",*destiny[i]);
    }
    printf("\n===end of copy_leaf======\n");
}

リーフタイプは次のように定義されます。

typedef char* leaftype;

入力として「例」という単語を含むコードを実行すると、コンソールに表示されます。

Type in a word: 
====start of copy_leaf======
strlen of source: 7
source: e-x-a-m-p-l-e-\0
strlen of destiny: 7
destiny: e-

そしてクラッシュします(Windows 7では「program.exeが動作を停止しました」など)。私は devcpp を使用していますが、私のファイルには C 拡張子が付いています。この char* を char* コンテンツコピーに修正するのを手伝ってくれる人はいますか? Cファイルである文字列の内容を別の文字列に何度もコピーする必要があるため、それを行う関数が必要です。前もって感謝します!

ps: copy_leaf関数で既に試したこと (絶望的な解決策):

  • leaftype ソースconst leaftypeソースに変更します(これはconst char* sourceになります)
  • *destiny = strcpy(*destiny,source)を作成します。これは、strcpy が宛先文字列へのポインターを返すためです。
4

3 に答える 3

4

を使用するべきではありませんが、この行のように*destiny[i]使用する必要があります。(*destiny)[i]

    else printf("%c-",(*destiny)[i]);

ところで、destiny はダブル ポインターです。とにかくダブル ポインターが本当に必要だとは思いません。

于 2013-10-01T20:11:12.453 に答える
1
printf("%c-",*destiny[i]);

destinyは char** であり、[] は * よりも優先されます。

したがって、これは次のように解釈されます。

printf("%c-",*(destiny[i]));

あなたが実際に欲しいとき:

printf("%c-", (*destiny)[i]);

つまり、実際には最初の (そして唯一の) ポインターの i 番目の要素が必要なときに、i 番目のポインターの最初の要素を読み取っていました。

于 2013-10-01T20:17:16.360 に答える
0

なぜ私はそれが好きですか?これらは、行われる次の修正です。

 void copy_leaf(leaftype* destiny, leaftype source)

への変更

void copy_leaf(leaftype destiny, leaftype source)

destiny = malloc((strlen(source)+1)*sizeof(char));

strcpy(destiny,source);


for(i = 0; i < strlen(destiny); i++)
    {
        printf("%c-",destiny[i]);


    }

ちなみに、strcpy の正しいプロトタイプは、ソース データが常に const char * であることです。

于 2013-10-01T20:12:32.207 に答える