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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

1回答

2521閲覧

関数strtoiでreturn (*str ? 0 : 1);がしっくりしないので、説明をお願いします

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/03/17 00:53

関数strtoiでreturn (str ? 0 : 1);がしっくりしないので、説明をお願いします
str ? 0 : 1はstrが真なら0、偽なら1を返すのはわかるのですが、たとえば
文字列”AB"を打ち込んだとき、関数strtoiではどこを実行してどこまで進むのですか。
一気に
x = sign;まで行くんですか。その時のstr==0になると思うのですが、
そこのところがよくわかりません。教えてください。

//文字列strを int型の値に変換した結果を*xに格納する int strtoi(const char *str, int *x) { int sign = 1; // 符号 while (isspace(*str)) // 空白類文字を読み飛ばす str++; switch (*str) { case '+' : str++; break; // 正符号 case '-' : str++; sign = -1; break; // 負符号 } for (*x = 0; *str >= '0' && *str <= '9'; str++) *x = *x * 10 + (*str - '0'); *x *= sign; return (*str ? 0 : 1); } int main(void) { int num; char buffer[100]; while (1) { printf("整数値を入力せよ:"); scanf("%s", buffer); if (!strtoi(buffer, &num)) puts("\a整数値に変換できませんでした。"); else { if (num == 9999) break; printf("あなたは%dと入力しましたね。\n", num); } } return (0); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

*strが真なら0、偽なら1を返すのはわかるのですが、

C言語では、条件判定の場所で数値を指定した場合、0以外を真、0を偽とみなす仕様なので、return (*str ? 0 : 1)に関しては、「*strが0以外なら0、0なら1を返す」という意味になります。ただ、それだと一見して条件が判りづらいので、私ならreturn *str == '\0'と書きますけど。

で、それが何をしているのかというと、ソースのコメントには書かれていませんが、「数値なら1、数値以外の文字が含まれていたら0を返す」という仕様を満たすためのコードです。

strtoi関数は渡された文字列を先頭から1文字ずつ読み取って処理しています。最終的にすべての文字を処理したら(数値として有効な文字のみで構成されていたら)、strポインタは終端文字(\0)を指し示しますが、もしアルファベットのような数値として認識できない文字が含まれていると、そこで止まることになります。
つまり、return (*str ? 0 : 1);は、すべての文字を処理した(=数値として正しく処理できた)か、途中で止まった(=不正な文字が含まれていた)か、を判定して返しているということです。

投稿2018/03/17 01:42

catsforepaw

総合スコア5938

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

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

退会済みユーザー

退会済みユーザー

2018/03/17 02:36

ありがとうございます。”AB"を打ち込んだ場合のstrtoiは*str==’A'なので、for文はどうなりますか。 *x *= sign;の *xは0になっています。よってmain文のif文が実行される。(*x==0は関係ないですか)、main文のif文が実行されるのはreturn==1のときですね。 *x==0になるところがわからないのですが、 数字(13)の場合strポインタは終端文字(\0)を指し示す。そのときの*x==13となり、*str==0(偽)で returnは1でif文は実行されず、else文を実行する。 もしアルファベット(AB)のような数値として認識できない文字が含まれていると、そこで止まることになります。「そこで止まる」どこでどのようにとまるのですか。*str==’A'(真)なのでreturnは0となり if文をじっこうするでいいでしょうか。
catsforepaw

2018/03/17 04:28

> 「そこで止まる」どこでどのようにとまるのですか。 for文の継続条件が、strポインタの指し示す場所の文字が数字かどうか、なので、数字でなければfor文が終了する、つまり、数字でない文字の場所でstrのインクリメントが止まるということです。 > *str==’A'(真)なのでreturnは0となり > if文をじっこうするでいいでしょうか。 それで合ってます。
退会済みユーザー

退会済みユーザー

2018/03/17 07:36

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問