0

これは純粋に私利私欲のためであり、宿題ではありません。

#include <stdio.h>

int main(void)
{
    char* str3;

    char* str1 = "Hello";
    char* str2 = "World!";

    while(*str1) str1++;
    while(*str1++ = *str2++);

    return 0;
}

私は C ポインターの理解を深めようとしています。そうすることで、2 つの文字列を連結し、結果を 3 番目の文字列に配置したいと考えています。上記の (不完全な) コードは segfault になり、その理由はわかりません。ポインタが参照する値をループして、データを別のアドレスにコピーすることはできませんか?

編集:

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

int main(void)
{
    char* str1 = "Hello";
    char* str2 = "World!";

    char *str3 = malloc(strlen(str1) + strlen(str2) + 1);

    while(*str1) *str3++ = *str1++;
    while(*str2) *str3++ = *str2++;

    puts(str3);

    return 0;
}

新しい試みは上にあり、機能していませんが、修正する必要がある「明白な」項目はありますか?

4

5 に答える 5

6
    while(*str1) str1++;

str1これは、文字列定数の末尾にある終端のゼロ バイトを指すまで進みます。

    while(*str1 = *str2++);

これにより、文字列の末尾のゼロバイトが変更されますが、文字列は定数であるため変更できません。

メモリ内で文字列をアセンブルしたい場合は、それを行うためのスペースを割り当てるか、そうする関数を使用する必要があります。あなたがすることができます:

char *new_string = malloc(strlen(str1) + strlen(str2) + 1);
strcpy(new_string, str1);
strcat(new_string, str2);

str1最初の行は、 の内容、str2の内容、および終端の 0 バイトを保持するのに十分なスペースを割り当てます。

于 2013-10-24T17:06:19.020 に答える
0

問題の 2 回目の試行では、null で終わる文字列を の末尾に配置できませんstr3。そのputsため、データの終わりを超えて読み取り、ゴミを出力し、無効なアドレスを読み取る前に 0 バイトがない場合はクラッシュすることさえあります。*str3 ='\0';after ループを追加します。

さらに、str3文字列の先頭を変更して失います。変数をもう 1 つ追加し、 によって返されたポインタを保持してmalloc、それを に渡しputsます。現在のコードは、新しい文字列の末尾から印刷を開始します。

次に、文字列リテラルへのポインターがある場合は、通常、文字列リテラルは読み取り専用のメモリ領域にあるため、それらを const char へのポインターにします。

const char* str1 = "Hello";
const char* str2 = "World!";
于 2013-10-24T19:14:45.743 に答える
0

定数文字列は変更できません。str3 を変更していません。必要がある

  1. str1 と str2 の長さを取得します。
  2. str1 の長さ + str2 の長さ + 1 の長さを malloc し、str3 に割り当てます。
  3. 必要に応じて while ループを使用してコピーするか、strcpy と strcat を使用して文字列を str3 にコピーできます。

あなたは学ぼうとしているので、私はあなたのためにコードを書かないようにしています。

于 2013-10-24T17:13:46.327 に答える
0
int main (void){
    char* str1 = "Hello";
    char* str2 = "World";

    int size1 = strlen(str1);
    int size2 = strlen(str2);
    int i = 0;

    char* out = malloc(sizeof(char)*(size1+size2)+1);

    for (i = 0; i < size1; i++){
        out[i] = str1[i];
    }
    for (i = 0; i < size2; i++){
        out[i+size1] = str2[i];
    }
    out[strlen(out)-1] = \0;
    //out is a string.
    //dont forget to free when you are done.  free(out);

}

Cをやってから数ヶ月経ちましたが、これはうまくいくでしょう。私の構文は少しずれているかもしれません。

于 2013-10-24T17:13:57.837 に答える