質問 6: 関数 void fun(char a[], char b[], int n) を作成してください。その機能は次のとおりです。文字列内の指定された添字の文字を削除します。このうち、aは元の文字列を指し、削除された文字列はbが指す配列に格納され、nはポインタを格納します。

画像の説明を追加してください

C テストの問題

質問6请编写一个函数void fun(char a[],char b[],int n),其功能是:删除一个字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。

ChatGPT は次のように答えます。

以下の知識点が主に調査されました。

1.“求整数中每个数字出现的次数”この問題では、データ構造におけるハッシュ テーブル (Hash Table) またはマップ (Map) の使用が主に検討されます。ハッシュ テーブルは、データをキーと値のペアの形式で保存するデータ構造であり、データの高速な挿入、検索、削除を可能にします。この問題では、ハッシュ テーブルを使用して各数値の出現回数を記録し、ハッシュ テーブルを走査して結果を出力します。

2.“找到数组中最大元素在数组中的下标”この問題については、基本的なアルゴリズムのアイデアが主に調査されます。配列を走査する方法を使用して、現在の最大要素の値と添字を毎回記録し、最後に最大要素の添字を出力できます。

3.“删除字符串中指定下标的字符”この問題では、文字列の基本的な操作とポインタの使い方を主に調べます。ポインタを使用して文字列内の文字を移動したり、指定された添え字を持つ文字を削除したりできます。具体的には、まず指定された添え字の前の文字にポインタを移動し、次にポインタを 1 ビット戻し、指定された添え字の文字をスキップし、最後にポインタの後ろの文字を 1 つずつ前に移動します。

プログラムの問題解決のアイデア:

1. については第一个问题,求整数中每个数字出现的次数、ハッシュ テーブルを使用して解決できます。具体的には、整数の各ビットを調べ、各数値をキーとして使用し、出現回数を値としてハッシュ テーブルに保存します。次に、ハッシュ テーブルを走査し、結果を出力します。

2. このために第二个问题,找到数组中最大元素在数组中的下标、配列を走査する方法を使用して、現在の最大要素の値と添字を毎回記録し、最後に最大要素の添字を出力します。

3. の場合第三个问题,删除字符串中指定下标的字符、ポインタを使用して文字列内の文字を移動し、指定された添え字を持つ文字を削除できます。具体的には、まず指定された添え字の前の文字にポインタを移動し、次にポインタを 1 ビット戻し、指定された添え字の文字をスキップし、最後にポインタの後ろの文字を 1 つずつ前に移動します。

解決策: C 言語コードの実装:

#include <stdio.h>

void fun(char a[], char b[], int n) {
    
    
    int i = 0, j = 0;
    while (a[i] != '\0') {
    
    
        if (i != n) {
    
    
            b[j] = a[i];
            j++;
        }
        i++;
    }
    b[j] = '\0';
}

int main() {
    
    
    char str1[] = "Hello World";
    char str2[100];
    int n = 6;
    fun(str1, str2, n);
    printf("Original string: %s\n", str1);
    printf("Modified string: %s\n", str2);
    return 0;
}

上記のコードでは、fun元の文字列 a、新しい文字列 b、および削除する文字の添え字 n の 3 つのパラメータを受け入れる関数を定義します。関数では、while ループを使用して、元の文字列 a の各文字を走査します。指定された添え字 n を走査するとき、この文字をスキップし、残りの文字を新しい文字列 b にコピーします。最後に、新しい文字列の末尾に文字列の終端マーカー '\0' を追加します。main関数では、生の文字列を定義しstr1、それをfun変更のために関数に渡します。最後に、元の文字列と変更された文字列を出力して、プログラムが正しいかどうかを確認します。

解決策 2: ポインターを使用して関数を実装します。具体的なコードは次のとおりです。

void fun(char a[], char b[], int n) {
    
    
    int len = strlen(a);
    int i, j;
    for (i = 0, j = 0; i < len; i++) {
    
    
        if (i != n) {
    
     // 如果不是指定下标,则将字符复制到新的数组中
            b[j++] = a[i];
        }
    }
    b[j] = '\0'; // 在新数组末尾添加'\0',表示字符串结束
}

int main() {
    
    
    char str1[] = "Hello World";
    char str2[100];
    int n = 6;
    fun(str1, str2, n);
    printf("Original string: %s\n", str1);
    printf("Modified string: %s\n", str2);
    return 0;
}

この関数は、まず元の文字列の長さを計算し、次に 2 つのポインター i と j を使用して元の文字列と新しい文字列を走査します。i が指す文字が指定された添字 n ではない場合は、その文字を新しい文字列にコピーします。それ以外の場合は、その文字をスキップします。最後に、新しい文字列の末尾に「\0」を追加して、文字列の終わりを示します。

解決策 3: 文字配列のシフト演算を使用して関数を実装します。具体的なコードは次のとおりです。

void fun(char a[], char b[], int n) {
    
    
    int len = strlen(a);
    int i;
    for (i = 0; i < len; i++) {
    
    
        if (i != n) {
    
     // 如果不是指定下标,则将字符复制到新的数组中
            b[i - (i > n)] = a[i];
        }
    }
    b[len - 1] = '\0'; // 在新数组末尾添加'\0',表示字符串结束
}

int main() {
    
    
    char str1[] = "Hello World";
    char str2[100];
    int n = 6;
    fun(str1, str2, n);
    printf("Original string: %s\n", str1);
    printf("Modified string: %s\n", str2);
    return 0;
}

この関数は元の文字列もトラバースし、i が指す文字が指定された添え字 n でない場合、その文字を新しい文字列にコピーし、n の後の文字を 1 ビット前に移動します。最後に、新しい文字列の末尾に「\0」を追加して、文字列の終わりを示します。

答えに満足したら、修正してください。

おすすめ

転載: blog.csdn.net/zp1990412/article/details/130745477