1. 要件の説明 数字の文字列を入力し、その文字列を整数に変換して出力するプログラムを作成します。 たとえば、入力文字列が「12345」の場合、出力される整数は 12345 になります。注意: C 言語ライブラリ関数 atoi は使用しないでください。 [[180304]] 2. アルゴリズム設計 整数 123 が与えられた場合、その表現は 123=1*100+2*10+3 になることは誰もが知っています。つまり、整数は桁数に応じて各桁の数字の合計で構成されます。 したがって、この要件の解決は非常に簡単です。文字列内の数字をその桁数に応じて追加するだけです。このプロセスでは、考慮すべき特別な状況がいくつかあります。 プログラムの全体的な流れを図 1 に示します。 図1 プログラムの全体的なプロセス 3. 特別なプロセスに関する考慮事項 プログラムを作成する過程では、入力数値文字列の長さと形式を考慮する必要があります。たとえば、次のようになります。 1. 入力文字列に数字以外の文字が含まれている場合、プログラムはそれ以上の処理を行わずに直接戻ります。 2. 数値文字列が 1 つ以上の文字 0 で始まる場合は、さらに処理を進める前にそれらを削除します。 3. C 言語では、整数 (int) が表すことができる最大数は 2147483647 であるため、入力された数値文字列が「2147483647」より大きい場合、プログラムはそれ以上の処理を行わずに直接戻ります。 4. プログラムコード - /******************************************************************************************
- * 著作権 (C) 2016、Zhou Zhaoxiong。
- *
- * ファイル名: StrToInt.c
- * ファイルID: なし
- * 内容要約: 文字列を整数に変換する
- * その他の指示: たとえば、「123」を123に変換します
- * 現在のバージョン: V1.0
- * 著者: 周昭雄
- * 完成日: 20160218
- *
- ******************************************************************************/
- #include < stdio.h >
- #include < limits.h > //コード内でINT_MAXが使用されるため、このヘッダーファイルをインクルードする必要があります
-
-
- // データ型を再定義する
- typedef signed char INT8;
- 型定義 int INT32;
- typedef 符号なし int UINT32;
-
-
- // 関数宣言
- INT32 CalIntVal(INT32 iBitLen);
- INT32 オーバーフローかどうかを判定します(INT8 *pszTestStr);
-
-
- /******************************************************************************************
- * 機能説明: 主な機能
- * 入力パラメータ: なし
- * 出力パラメータ: なし
- * 戻り値: 0 - 実行成功 その他 - 実行失敗
- * その他の指示: なし
- * 変更日 バージョン番号 修正者 変更内容
- * ---------------------------------------------------------------------
- * 20160218 V1.0 作成者: Zhou Zhaoxiong
- ******************************************************************************/
- INT32 メイン()
- {
- INT8 szInputStr[100] = {0};
- INT8 szTestStr[100] = {0};
- INT32 iResultInt = 0 ; // 変換後の整数は *** 2147483647 をサポートします
- UINT32 iPosFlag = 0 ;
- UINT32 iTestStrLen = 0 ;
- UINT32 iBitVal = 0 ;
- INT32 iRetVal = 0 ;
-
- printf("int の最大値は %d\n", INT_MAX); // int の最大値を見つける
-
- printf("文字列を入力してください: \n");
- scanf("%s", szInputStr);
- printf(" InputStr =%s\n", szInputStr);
-
- // 入力文字列に数字以外の文字が含まれているかどうかを確認します。含まれている場合は、直接終了します。
- ( iPosFlag = 0 ; iPosFlag < strlen (szInputStr); iPosFlag++)
- {
- (szInputStr[iPosFlag] < '0' || szInputStr[iPosFlag] > '9')の場合
- {
- printf("%s はデジタル文字列ではありません。確認してください!\n", szInputStr);
- -1 を返します。
- }
- }
-
- // 文字列の前に0文字がある場合はそれを削除します
- iPosフラグ= 0 ;
- (szInputStr[iPosFlag] == '0') の場合
- {
- iPosFlag++;
- }
-
- // 0を削除した後の文字列値を取得します
- strncpy(szTestStr、szInputStr+iPosFlag、strlen(szInputStr)-iPosFlag);
-
- // 文字列が2147483647より大きいかどうかを確認します。大きい場合は、直接終了します。
- iRetVal =オーバーフローを判断する(szTestStr);
- (iRetVal != 0) の場合
- {
- printf("%s は INT_MAX(2147483647) より大きいです。確認してください!\n", szTestStr);
- -1 を返します。
- }
-
- // 文字列に対応する整数値を計算します
- iTestStrLen = strlen (szTestStr);
- 結果が0になる
- ( iPosFlag = 0 ; iPosFlag < iTestStrLen ; iPosFlag++) 関数
- {
- iBitVal = szTestStr [iPosFlag] - '0'; // 各ビットに対応する数値を計算する
- iResultInt iResultInt = iResultInt + iBitVal * CalIntVal(iTestStrLen-iPosFlag);
- }
-
- printf(" ResultInt =%d\n", iResultInt);
-
- 0を返します。
- }
-
-
- /******************************************************************************************
- * 関数の説明: 入力文字列がオーバーフローするかどうかを判定する
- * 入力パラメータ: pszTestStr-テスト文字列
- * 出力パラメータ: なし
- * 戻り値: 1 - オーバーフロー 0 - オーバーフローなし
- * その他の命令: 文字列が2147483647より大きいかどうかを判定します。大きい場合はオーバーフローします。
- * 変更日 バージョン番号 修正者 変更内容
- * -----------------------------------------------------------------
- * 20160218 V1.0 作成者: Zhou Zhaoxiong
- ******************************************************************************/
- INT32 オーバーフローかどうかを判定(INT8 *pszTestStr)
- {
- UINT32 iTestStrLen = 0 ;
- INT8 szProcessedStr[100] = {0};
- INT8 szMaxValOfInt[100] = {0};
-
- snprintf(szMaxValOfInt, sizeof(szMaxValOfInt)-1, "%d", INT_MAX); // intの最大値を見つける
-
- iTestStrLen = strlen (pszTestStr);
-
- if (iTestStrLen > strlen(szMaxValOfInt)) // 長さが超過
- {
- 1 を返します。
- }
- else if ( iTestStrLen == strlen(szMaxValOfInt)) // 長さは等しい
- {
- if (strcmp(pszTestStr, szMaxValOfInt) > 0) // オーバーフロー
- {
- 1 を返します。
- }
- それ以外
- {
- 0を返します。
- }
- }
- else // テスト文字列の長さが「2147483647」未満なので、オーバーフローは発生しません
- {
- 0を返します。
- }
- }
-
-
-
- /******************************************************************************************
- * 関数の説明: 文字列の各ビットに対応する整数値を見つける
- * 入力パラメータ: iBitLen - 対応する整数のビット数
- * 出力パラメータ: なし
- * 戻り値: ビットに対応する整数値
- * その他の指示: なし
- * 変更日 バージョン番号 修正者 変更内容
- * -----------------------------------------------------------------
- * 20160218 V1.0 作成者: Zhou Zhaoxiong
- ******************************************************************************/
- INT32 計算値(INT32 iBitLen)
- {
- if ( iBitLen == 1) // 単位の桁
- {
- 1 を返します。
- }
- それ以外
- {
- 10 * CalIntVal(iBitLen-1) を返します。
- }
- }
5. プログラムのテスト 作成したプログラム「StrToInt.c」をLinuxマシンにアップロードし、「gcc -g -o StrToIntStrToInt.c」コマンドを使用してプログラムをコンパイルし、「StrToInt」ファイルを生成します。以下はプログラムの詳細なテストです。 1. 入力文字列が「12345」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- 12345
- 入力文字列= 12345
- 結果整数= 12345
2. 入力文字列が「-12345」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- -12345
- 入力文字列=-12345
- -12345 はデジタル文字列ではありません。確認してください。
3. 入力文字列が「123456a」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- 123456a
- 入力文字列= 123456a
- 123456a はデジタル文字列ではありません。確認してください。
4. 入力文字列が「012345」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- 012345
- 入力文字列= 012345
- 結果整数= 12345
5. 入力文字列が「0123450」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- 0123450
- 入力文字列= 0123450
- 結果整数= 123450
6. 入力文字列が「2147483647」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- 2147483647
- 入力文字列= 2147483647
- 結果整数= 2147483647
7. 入力文字列が「2147483648」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- 2147483648
- 入力文字列= 2147483648
- 2147483648はINT_MAX(2147483647)より大きいので確認してください。
8. 入力文字列が「123456789012」の場合、プログラムは次のように実行されます。 - intの最大値は2147483647です
- 文字列を入力してください:
- 123456789012
- 入力文字列= 123456789012
- 123456789012はINT_MAX(2147483647)より大きいので確認してください。
プログラムは、上で検討したいくつかの特殊なケースを正しく処理できることがわかります。 6. 需要拡大 この記事の要件と手順に基づいて、要件の次の拡張を検討できます。 1. 入力文字列は数字に限定されず、先頭に「+」または「-」を含めることもできます。文字列が「+」で始まる場合、整数出力は正の整数になります。文字列が「-」で始まる場合、整数出力は負の整数になります。 2. 入力された数値文字列が「2147483647」より大きい場合、プログラムは整数値 2147483647 を直接出力します。 [この記事は51CTOコラムニストの周兆雄氏によるオリジナル記事です。著者のWeChat公開アカウント:周の論理(logiczhou)] この著者の他の記事を読むにはここをクリックしてください |