[文字列処理アルゴリズム] 文字列を整数に変換するアルゴリズム設計とCコード実装

[文字列処理アルゴリズム] 文字列を整数に変換するアルゴリズム設計とCコード実装

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. プログラムコード

  1. /******************************************************************************************
  2. * 著作権 (C) 2016、Zhou Zhaoxiong。
  3. *
  4. * ファイル名: StrToInt.c
  5. * ファイルID: なし
  6. * 内容要約: 文字列を整数に変換する
  7. * その他の指示: たとえば、「123」を123に変換します
  8. * 現在のバージョン: V1.0
  9. * 著者: 周昭雄
  10. * 完成日: 20160218
  11. *
  12. ******************************************************************************/
  13. #include < stdio.h >  
  14. #include < limits.h > //コード内でINT_MAXが使用されるため、このヘッダーファイルをインクルードする必要があります
  15.  
  16.  
  17. // データ型を再定義する
  18. typedef signed char INT8;
  19. 型定義 int INT32;
  20. typedef 符号なし int UINT32;
  21.  
  22.  
  23. // 関数宣言
  24. INT32 CalIntVal(INT32 iBitLen);
  25. INT32 オーバーフローかどうかを判定します(INT8 *pszTestStr);
  26.  
  27.  
  28. /******************************************************************************************
  29. * 機能説明: 主な機能
  30. * 入力パラメータ: なし
  31. * 出力パラメータ: なし
  32. * 戻り値: 0 - 実行成功 その他 - 実行失敗
  33. * その他の指示: なし
  34. * 変更日 バージョン番号 修正者 変更内容
  35. * ---------------------------------------------------------------------
  36. * 20160218 V1.0 作成者: Zhou Zhaoxiong
  37. ******************************************************************************/
  38. INT32 メイン()
  39. {
  40. INT8 szInputStr[100] = {0};
  41. INT8 szTestStr[100] = {0};
  42. INT32 iResultInt = 0 ; // 変換後の整数は *** 2147483647 をサポートします
  43. UINT32 iPosFlag = 0 ;
  44. UINT32 iTestStrLen = 0 ;
  45. UINT32 iBitVal = 0 ;
  46. INT32 iRetVal = 0 ;
  47.  
  48. printf("int の最大値は %d\n", INT_MAX); // int の最大値を見つける
  49.      
  50. printf("文字列を入力してください: \n");
  51. scanf("%s", szInputStr);
  52. printf(" InputStr =%s\n", szInputStr);
  53.  
  54. // 入力文字列に数字以外の文字が含まれているかどうかを確認します。含まれている場合は、直接終了します。
  55. ( iPosFlag = 0 ; iPosFlag <   strlen (szInputStr); iPosFlag++)
  56. {
  57. (szInputStr[iPosFlag] < '0' || szInputStr[iPosFlag] > '9')の場合
  58. {
  59. printf("%s はデジタル文字列ではありません。確認してください!\n", szInputStr);
  60. -1 を返します。
  61. }
  62. }
  63.  
  64. // 文字列の前に0文字がある場合はそれを削除します
  65. iPosフラグ= 0 ;
  66. (szInputStr[iPosFlag] == '0') の場合
  67. {
  68. iPosFlag++;
  69. }
  70.  
  71. // 0を削除した後の文字列値を取得します
  72. strncpy(szTestStr、szInputStr+iPosFlag、strlen(szInputStr)-iPosFlag);
  73.  
  74. // 文字列が2147483647より大きいかどうかを確認します。大きい場合は、直接終了します。
  75. iRetVal =オーバーフローを判断する(szTestStr);
  76. (iRetVal != 0) の場合
  77. {
  78. printf("%s は INT_MAX(2147483647) より大きいです。確認してください!\n", szTestStr);
  79. -1 を返します。
  80. }
  81.      
  82. // 文字列に対応する整数値を計算します
  83. iTestStrLen = strlen (szTestStr);
  84. 結果0になる
  85. ( iPosFlag = 0 ; iPosFlag <   iTestStrLen ; iPosFlag++) 関数
  86. {
  87. iBitVal = szTestStr [iPosFlag] - '0'; // 各ビットに対応する数値を計算する
  88. iResultInt iResultInt = iResultInt + iBitVal * CalIntVal(iTestStrLen-iPosFlag);
  89. }
  90.  
  91. printf(" ResultInt =%d\n", iResultInt);
  92.      
  93. 0を返します。
  94. }
  95.  
  96.  
  97. /******************************************************************************************
  98. * 関数の説明: 入力文字列がオーバーフローするかどうかを判定する
  99. * 入力パラメータ: pszTestStr-テスト文字列
  100. * 出力パラメータ: なし
  101. * 戻り値: 1 - オーバーフロー 0 - オーバーフローなし
  102. * その他の命令: 文字列が2147483647より大きいかどうかを判定します。大きい場合はオーバーフローします。
  103. * 変更日 バージョン番号 修正者 変更内容
  104. * -----------------------------------------------------------------
  105. * 20160218 V1.0 作成者: Zhou Zhaoxiong
  106. ******************************************************************************/
  107. INT32 オーバーフローかどうかを判定(INT8 *pszTestStr)
  108. {
  109. UINT32 iTestStrLen = 0 ;
  110. INT8 szProcessedStr[100] = {0};
  111. INT8 szMaxValOfInt[100] = {0};
  112.  
  113. snprintf(szMaxValOfInt, sizeof(szMaxValOfInt)-1, "%d", INT_MAX); // intの最大値を見つける
  114.  
  115. iTestStrLen = strlen (pszTestStr);
  116.  
  117. if (iTestStrLen > strlen(szMaxValOfInt)) // 長さが超過
  118. {
  119. 1 を返します。
  120. }
  121. else if ( iTestStrLen == strlen(szMaxValOfInt)) // 長さは等しい
  122. {
  123. if (strcmp(pszTestStr, szMaxValOfInt) > 0) // オーバーフロー
  124. {
  125. 1 を返します。
  126. }
  127. それ以外
  128. {
  129. 0を返します。
  130. }
  131. }
  132. else // テスト文字列の長さが「2147483647」未満なので、オーバーフローは発生しません
  133. {
  134. 0を返します。
  135. }
  136. }
  137.  
  138.  
  139.  
  140. /******************************************************************************************
  141. * 関数の説明: 文字列の各ビットに対応する整数値を見つける
  142. * 入力パラメータ: iBitLen - 対応する整数のビット数
  143. * 出力パラメータ: なし
  144. * 戻り値: ビットに対応する整数値
  145. * その他の指示: なし
  146. * 変更日 バージョン番号 修正者 変更内容
  147. * -----------------------------------------------------------------
  148. * 20160218 V1.0 作成者: Zhou Zhaoxiong
  149. ******************************************************************************/
  150. INT32 計算値(INT32 iBitLen)
  151. {
  152. if ( iBitLen == 1) // 単位の桁
  153. {
  154. 1 を返します。
  155. }
  156. それ以外
  157. {
  158. 10 * CalIntVal(iBitLen-1) を返します。
  159. }
  160. }

5. プログラムのテスト

作成したプログラム「StrToInt.c」をLinuxマシンにアップロードし、「gcc -g -o StrToIntStrToInt.c」コマンドを使用してプログラムをコンパイルし、「StrToInt」ファイルを生成します。以下はプログラムの詳細なテストです。

1. 入力文字列が「12345」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. 12345
  4. 入力文字列= 12345  
  5. 結果整数= 12345  

2. 入力文字列が「-12345」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. -12345
  4. 入力文字列=-12345
  5. -12345 はデジタル文字列ではありません。確認してください。

3. 入力文字列が「123456a」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. 123456a
  4. 入力文字列= 123456a  
  5. 123456a はデジタル文字列ではありません。確認してください。

4. 入力文字列が「012345」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. 012345
  4. 入力文字列= 012345  
  5. 結果整数= 12345  

5. 入力文字列が「0123450」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. 0123450
  4. 入力文字列= 0123450  
  5. 結果整数= 123450  

6. 入力文字列が「2147483647」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. 2147483647
  4. 入力文字列= 2147483647  
  5. 結果整数= 2147483647  

7. 入力文字列が「2147483648」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. 2147483648
  4. 入力文字列= 2147483648  
  5. 2147483648はINT_MAX(2147483647)より大きいので確認してください。

8. 入力文字列が「123456789012」の場合、プログラムは次のように実行されます。

  1. intの最大値は2147483647です
  2. 文字列を入力してください:
  3. 123456789012
  4. 入力文字列= 123456789012  
  5. 123456789012はINT_MAX(2147483647)より大きいので確認してください。

プログラムは、上で検討したいくつかの特殊なケースを正しく処理できることがわかります。

6. 需要拡大

この記事の要件と手順に基づいて、要件の次の拡張を検討できます。

1. 入力文字列は数字に限定されず、先頭に「+」または「-」を含めることもできます。文字列が「+」で始まる場合、整数出力は正の整数になります。文字列が「-」で始まる場合、整数出力は負の整数になります。

2. 入力された数値文字列が「2147483647」より大きい場合、プログラムは整数値 2147483647 を直接出力します。

[この記事は51CTOコラムニストの周兆雄氏によるオリジナル記事です。著者のWeChat公開アカウント:周の論理(logiczhou)]

この著者の他の記事を読むにはここをクリックしてください

<<:  ビッグデータの3つの柱:データ、ブロックチェーン、アルゴリズム

>>:  【文字列処理アルゴリズム】回文判定のアルゴリズム設計とCコード実装

ブログ    
ブログ    
ブログ    

推薦する

2023年に人工知能とデータサイエンスについて知っておくべきこと

人工知能とデータサイエンスは、2023 年に最もエキサイティングで影響力のある 2 つのテクノロジー...

数日間GitHubのホットリストを独占した後、Colossal-AIが正式にリリースされました

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

ビッグデータと人工知能が決済に革命を起こす

事実は、データ技術の進歩と発展により、仮想カードと電子ウォレットが支払い管理により適したものになって...

Ruan Yifeng: Github のオブジェクトカウントアルゴリズム

Github を使用しているときに、次のプロンプトを見たことがありますか? $ gitクローン ht...

...

ディープラーニングニューラルネットワークによる予測区間

[[390133]]予測区間は、回帰問題の予測における不確実性の尺度を提供します。たとえば、95% ...

英国メディア:シリコンバレーの一部の人々はAIに熱心すぎて「学習は無意味だ」と言っている

6月13日のニュース、人工知能の急速な発展に伴い、シリコンバレーは、人間の行動は予測可能であり、スキ...

人間と機械のインターフェースは一貫性があり、音声と触覚によるフィードバックを提供する必要がある。

[[187855]]仮想環境を体験し、対話する機能は、仮想現実 (VR) メディアの独自の機能です...

人工知能が人々を生き返らせる

Google を含む多くの企業が、人間の寿命を延ばす方法を研究しています。たとえ何百年も長く生きられ...

2021年:AIが普及する年

リン・ジエル科学技術の継続的な進歩と発展に伴い、人工知能の発展は時代の必然的な流れであり、我が国の経...

COVID-19 最新情報: COVID-19 との戦いに役立つトップ 10 のイノベーション

[[320870]]迅速な感染検査から3Dプリントソリューションまで、世界中のテクノロジー企業が協力...

...

IBMの新しいデータ分析アルゴリズムは、20分で9TBのデータを分析できる

IBMは最近、スイスのチューリッヒ研究所がデータ分析アルゴリズムにおいて画期的な進歩を遂げ、膨大なデ...

知っておくべきビッグデータ用語 75 選

パート1(25用語)ビッグデータに不慣れな場合、この分野を理解したり、どこから始めればよいのかわから...