1. 要件の説明 長い文字列と短い文字列を入力し、短い文字列に現れる文字を長い文字列から削除するプログラムを作成します。 たとえば、長い文字列が「1234abcd」で短い文字列が「3a」の場合、プログラムによって処理された後の文字列は「124bcd」になります。また、別の例として、長い文字列が「good bye」で短い文字列が「obh」の場合、プログラムによって処理された後の文字列は「gd ye」になります。 2. アルゴリズム設計 長い文字列の文字と短い文字列の文字を 1 つずつ比較することで、長い文字列から文字を削除する必要があるかどうかを判断できます。 つまり、長い文字列が「1234abcd」で、短い文字列が「2a」の場合、最初に長い文字列の最初の文字「1」を短い文字列の「2」と「a」と比較し、それらが等しくないことがわかったら、文字「1」を新しい文字列に追加します。次に、長い文字列の 2 番目の文字「2」を短い文字列の「2」と「a」と比較し、それらが等しいことがわかったら、文字「2」を新しい文字列に追加しません。このサイクルを、長い文字列のすべての文字が比較されるまで繰り返します。 3. 特別なプロセスに関する考慮事項 プログラムを作成する過程では、次のような入力文字列の長さと形式を考慮する必要があります。 1. 2 つの入力文字列の 1 つに中国語の文字が含まれている場合、プログラムは後続の処理を実行せずに直接戻ります。 2. 短い文字列入力の長さが長い文字列の長さよりも大きい場合、プログラムは後続の処理を実行せずに直接戻ります。 4. プログラムコード - /******************************************************************************************
- * 著作権 (C) 2016、Zhou Zhaoxiong。
- *
- * ファイル名: RemoveChars.c
- * ファイルID: なし
- * 内容の要約: 短い文字列に現れる長い文字列の文字を削除する
- * その他の指示: たとえば、長い文字列が「My name」で短い文字列が「na」の場合、結果は「My me」になります。
- * 現在のバージョン: V1.0
- * 著者: 周昭雄
- * 完成日: 20160318
- *
- ******************************************************************************/
- #include < stdio.h >
-
- // データ型を再定義する
- typedef signed char INT8;
- 型定義 int INT32;
- typedef 符号なし int UINT32;
-
- // 関数宣言
- void RemoveCharsFromStr(INT8 *pszInputLongStr, INT8 *pszInputShortStr);
-
-
- /******************************************************************************************
- * 機能説明: 主な機能
- * 入力パラメータ: なし
- * 出力パラメータ: なし
- * 戻り値: 0 - 実行成功 その他 - 実行失敗
- * その他の指示: なし
- * 変更日 バージョン番号 修正者 変更内容
- * ---------------------------------------------------------------------
- * 20160318 V1.0 作成者: Zhou Zhaoxiong
- ******************************************************************************/
- INT32 メイン()
- {
- INT8 szInputLongStr[100] = {0};
- INT8 szInputShortStr[50] = {0};
- UINT32 iPosFlag = 0 ;
-
- printf("長い文字列を入力してください: \n");
- szInputLongStr を取得します。
- printf(" InputLongStr =%s\n", szInputLongStr);
-
- printf("短い文字列を入力してください: \n");
- szInputShortStr を取得します。
- printf(" InputShortStr =%s\n", szInputShortStr);
-
- // 2つの文字列に中国語の文字が含まれているかどうかを判定します
- ( iPosFlag = 0 ; iPosFlag < strlen (szInputLongStr); iPosFlag++)
- {
- if (szInputLongStr[iPosFlag] < 0 ) // 0未満は中国語の文字が含まれていることを意味します
- {
- printf("%s には中国語の文字が含まれています。確認してください!\n", szInputLongStr);
- -1 を返します。
- }
- }
-
- ( iPosFlag = 0 ; iPosFlag < strlen (szInputShortStr); iPosFlag++)
- {
- if (szInputShortStr[iPosFlag] < 0 ) // 0未満は中国語の文字が含まれていることを意味します
- {
- printf("%s には中国語の文字が含まれています。確認してください!\n", szInputShortStr);
- -1 を返します。
- }
- }
-
- // 短い文字列の長さが長い文字列の長さを超えているかどうかを判定します
- (strlen(szInputShortStr) > strlen(szInputLongStr)の場合)
- {
- printf("%s は %s より長いです。確認してください!\n", szInputShortStr, szInputLongStr);
- -2 を返します。
- }
-
- // 長い文字列から短い文字列の文字を削除する関数を呼び出す
- 文字列から文字を削除します。
-
- 0を返します。
- }
-
-
- /******************************************************************************************
- * 関数の説明: 長い文字列から短い文字列の文字を削除します
- * 入力パラメータ: pszInputLongStr - 入力する長い文字列
- pszInputShortStr - 入力の短い文字列
- * 出力パラメータ: なし
- * 戻り値: なし
- * その他の指示: なし
- * 変更日 バージョン番号 修正者 変更内容
- * ---------------------------------------------------------------------
- * 20160318 V1.0 作成者: Zhou Zhaoxiong
- ******************************************************************************/
- void RemoveCharsFromStr(INT8 *pszInputLongStr, INT8 *pszInputShortStr)
- {
- INT8 szNewtStr[100] = {0};
- UINT32 iOuterLoopFlag = 0 ;
- UINT32 iInnerLoopFlag = 0 ;
- UINT32 iCharUseFlag = 0 ;
-
- if ( pszInputLongStr == NULL || pszInputShortStr == NULL)
- {
- 戻る;
- }
-
- memset(szNewtStr, 0x00, sizeof(szNewtStr));
-
- ( iOuterLoopFlag = 0 ; iOuterLoopFlag < strlen (pszInputLongStr); iOuterLoopFlag++)
- {
- iChar使用フラグ= 1 ;
- ( iInnerLoopFlag = 0 ; iInnerLoopFlag < strlen (pszInputShortStr); iInnerLoopFlag++)
- {
- pszInputLongStr[iOuterLoopFlag] == pszInputShortStr[iInnerLoopFlag]の場合
- {
- iCharUseFlag = 0 ; // この文字を新しい文字列に追加しない
- 壊す;
- }
- }
-
- ( iCharUseFlag == 1)の場合
- {
- strncat(szNewtStr、pszInputLongStr+iOuterLoopFlag、1);
- }
- }
-
- printf("%s から %s の文字を削除します。新しい文字列は %s\n です", pszInputShortStr, pszInputLongStr, szNewtStr);
- }
5. プログラムのテスト 記述したプログラム「RemoveChars.c」を Linux マシンにアップロードし、「gcc -g -o RemoveCharsRemoveChars.c」コマンドを使用してプログラムをコンパイルし、「RemoveChars」ファイルを生成します。以下はプログラムの詳細なテストです。 1. 長い文字列が「1234abcd」で、短い文字列が「2a」の場合、プログラムは次のように実行されます。 - 長い文字列を入力してください:
- 1234abcd
- 入力長文字列= 1234abcd
- 短い文字列を入力してください:
- 2a
- 入力ショートストリング= 2a
- 1234abcd から 2a の文字を削除すると、新しい文字列は 134bcd になります。
2. 長い文字列が「Happy dog!」で、短い文字列が「ao」の場合、プログラムは次のように実行されます。 - 長い文字列を入力してください:
- 幸せな犬!
- InputLongStr =幸せな犬!
- 短い文字列を入力してください:
- あお
- 入力ショート文字列= ao
- Happy dog! から ao の文字を削除します。新しい文字列は Hppy dg! です。
3. 長い文字列が「我们123」で短い文字列が「345」の場合、プログラムは次のように実行されます。 - 長い文字列を入力してください:
- 私たち123
- 入力長文字列= us 123
- 短い文字列を入力してください:
- 345
- 入力ショートストリング= 345
- 123には中国語の文字がありますので、ご確認ください。
4. 長い文字列が「12345」で短い文字列が「234567」の場合、プログラムは次のように実行されます。 - 長い文字列を入力してください:
- 12345
- 入力長文字列= 12345
- 短い文字列を入力してください:
- 234567
- 入力ショート文字列= 234567
- 234567 は 12345 より長いです。確認してください。
5. 長い文字列が「abcdsf」で短い文字列が「af2」の場合、プログラムは次のように実行されます。 - 長い文字列を入力してください:
- アブダビ
- 入力長文字列= abcdsf
- 短い文字列を入力してください:
- AF2 2015/03/13
- 入力ショート文字列= af2
- abcdsf から af2 の文字を削除します。新しい文字列は bcds です。
6. 需要拡大 この記事の要件と手順に基づいて、要件の次の拡張を検討できます。 1. 短い文字列の文字が長い文字列内に存在する場合、長い文字列からその文字を直接削除するのではなく、長い文字列内の対応する位置をスペースで埋めます。 2. 入力文字列に漢字が出現してはならないという制限はありません。つまり、長い文字列が「我们123」で、短い文字列が「我1」の場合、プログラム処理後の文字列は「们23」になります。 [この記事は51CTOコラムニストの周兆雄氏によるオリジナル記事です。著者のWeChat公開アカウント:周の論理(logiczhou)] この著者の他の記事を読むにはここをクリックしてください |