質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

4回答

4323閲覧

C言語 atoi関数の実際の実装を知りたい。ライブラリの関数の実装を見ることは可能か?

Kchan_01

総合スコア110

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

2グッド

3クリップ

投稿2020/03/12 08:07

C言語を勉強している初心者です。
C言語のライブラリに用意されているatoi関数について質問です。

言語の勉強のため、atoi関数を自作しています。

下記のようなコードになったのですが、下記のコードには弱点があります。
intのMINである-2147483648を変換するときに、一時的に変数resの中に、2147483648が代入されてしまいます。
intの上限を超えるため未定義となるので、避けたい実装です。

intがオーバーフローを起こさない実装方法は2個ほど思いついたのですが、どちらもスマートではない気がします。

ライブラリの実際のコードが最も素晴らしい実装になっているはずなので、それを答えとして確認したいです。
ですが、調べたところ見つかりませんでした

私の検索する能力が低く、たどり着けないのか、それともそもそも非公開なのか、ご存知の方がいらっしゃったら、教えていただけますでしょうか。

c

1int ft_atoi(char *str) 2{ 3 int res; 4 int sign; 5 int i; 6 7 res = 0; 8 sign = 1; 9 i = 0; 10 11 while ((str[i] == ' ') || (str[i] == '\t') || (str[i] == '\n') || (str[i] == '\v') || (str[i] == '\r') || (str[i] == '\f')) 12 i++; 13 if (str[i] == '-') 14 sign = -1; 15 if (str[i] == '+' || str[i] == '-') 16 i++; 17 18 while (str[i] && (str[i] >= '0') && (str[i] <= '9')) 19 { 20 res = res * 10; 21 res += (int)str[i] - '0'; 22 i++; 23 } 24 return res * sign; 25}
s.k, yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/03/12 08:34

C言語ランタイムライブラリは処理系のパッケージに含まれることが多いので、Visual Studio、MinGW、gccなどを示されると良いです。(C言語の仕様にのっとりますが、実装コードが違います)大抵は何らかの方法でソースコードが得られます。
guest

回答4

0

ベストアンサー

GNU Cライブラリ(glibc)の atoi関数実装BSD libcライブラリatoi関数実装Newlibライブラリatoi関数実装 では、単純にstrtol関数に委譲しているだけですね。

muslライブラリatoi関数実装 を引用します:

c

1int atoi(const char *s) 2{ 3 int n=0, neg=0; 4 while (isspace(*s)) s++; 5 switch (*s) { 6 case '-': neg=1; 7 case '+': s++; 8 } 9 /* Compute n as a negative number to avoid overflow on INT_MIN */ 10 while (isdigit(*s)) 11 n = 10*n - (*s++ - '0'); 12 return neg ? n : -n; 13}

下記のようなコードになったのですが、下記のコードには弱点があります。
intのMINである-2147483648を変換するときに、一時的に変数resの中に、2147483648が代入されてしまいます。

muslライブラリでは、累積計算を負数で行うことで範囲[0, -2147483648]を安全に表現しておき、最後に符号反転するというトリッキーな実装になっているようです。

投稿2020/03/12 08:36

編集2020/03/12 09:24
yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C 標準ライブラリの実装のソースを見たいなら、GNU C Library (glibc) のソースを見るのがよいかも知れません。

FSF からダウンロードしてくるとか、Linux 系ならソースをパッケージで入れることもできるでしょう。

投稿2020/03/12 08:14

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2020/03/12 08:11

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

printf()のソースコードで、ソースコードリーディングのコツを身に付ける (1/3)

こんな感じの記事がありました。

GitHubにはありませんでしたが、こちらがそれっぽいですね。
https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=stdlib/atoi.c;hb=HEAD

こちらからたどりました。
https://www.gnu.org/software/libc/sources.html

投稿2020/03/12 08:13

tetsunosuke

総合スコア1295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問