0

だから私は無駄に次の問題を解決しようとしてきました:

指定した数の文字を文字列から削除する removeString という関数を作成します。この関数は、ソース文字列、ソース文字列の開始インデックス番号、および削除する文字数の 3 つの引数を取る必要があります。そのため、配列テキストに文字列「the wrong son」が含まれている場合、呼び出し

removeString (テキスト、4、6);

配列テキストから文字 "wrong" ("wrong" という単語とそれに続くスペース) を削除する効果があります。テキスト内の結果の文字列は「息子」です。

他の解決策を調べてみましたが、それらはすべてmemcpy、私の本ではまだ紹介されていないため、回避したい機能を使用しており、いわば「システムをだます」ことはしたくありません。

私の removeString 関数は次のとおりです。

void removeString (char text[], int x, int y)
{
    char output[81];
    int i, z = 0;
        
    for ( i = 0; (i <= 81); i++) {
            
        if (z < (x-1) || z > (x+y-1) ) {
            output[z] = text[z];
            //printf("%i\n", z);
            z++;
        } else {
            z++;
        }
            
    }
        
}

int main(void)
{
    char s1[81] = "the wrong son";
    int startPoint = 4, runLength = 6;
    
    removeString(s1, startPoint, runLength);
    
    printf("The new text is as follows:\n");
    printf("%s\n", s1);
    
    return 0;
}

「z」の値を印刷すると、数字がスキップされていることがわかりますが、何らかの理由ですべてを にコピーしているように見えtext[]ますoutput[]

4

2 に答える 2

1
           output[z] = text[z];

これは、新しい配列のすべての要素が、元の配列と同じインデックスにあることを意味します。また、ローカルで宣言するのではなく、パラメーターとして出力を取得する必要があります。

void removeString (char text[], char output[], int x, int y)
{
    for(int i = 0; i < x; i++)
        output[i] = text[i];

    for (int i = y; text[i] != '\0'; i++)
        output[i - (y - x)] = text[i];

}

int main(void)
{
    char s1[81] = "the wrong son";
    char output[81];
    int startPoint = 4, runLength = 6;

    removeString(s1, output, startPoint, runLength);

    printf("The new text is as follows:\n");
    printf("%s\n", s1);

    return 0;
}
于 2013-11-05T18:14:13.383 に答える