🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

2465閲覧

関数strtolについて

carnage0216

総合スコア194

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/02/22 17:37

編集2021/02/22 17:58
int main(void) { char str[] = "0123456789"; int a, b, c; //atoi関数 手軽だが変換に失敗しても検出できない //10進数表記専用 a = atoi(str);//文字列の先頭のアドレスをint型の整数にしてaに代入する、 //なのでaの中身は123456789となる。 //strtol/strtoul関数 変換出来なかった文字へのポインタを監視することで変換失敗を検出できる //2~16進数に対応できる char* p;//ポインタにpをポインタ変数宣言する。 b = strtol(str, &p, 10);//0123456789の10個のstrtol //ポインタpの先頭のアドレスを引数に if (p == str) {//一文字も変換出来なかった、要は変換できたデータ数が0だった printf("変換失敗\n"); } //sscanf関数 関数の戻り値を監視することで変換失敗を検出できる //8,10,16進数に対応できる #pragma warning(suppress : 4996) int n = sscanf(str, "%d", &c); if (n == 0) {//変換できたデータ数が0だった printf("変換失敗\n"); } printf("%d %d %d", a, b, c); return 0; }

読解力がないせいでstrtolを調べても引数を使ってint型のbを返り値にするとしかわかりませんでした。
strは文字列を表し、&pはポインタpのアドレスを指す、10は0123456789の10個だと思いますが、この引数3つを使ってどうやってint型の123456789を導いたかの過程が知りたいです、
どうかわかりやすく例文などを道いて説明して頂けないでしょう、よろしくお願いいたします。

編集
b = strtol(str, &p, 10);//strからアドレスを読み取り、ポインタpのアドレスを知り、
//0123456789を引数にというとことまではわかりますが、この引数がどう働いてint型のbに代入される形になるかわかりません。
strtol(str, &p, 10);で引数を基に関数strtolの内部で処理して、その返り値をint型のbに代入する。。。
関数とはそういうものでなのですね。

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

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

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

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

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

episteme

2021/02/22 18:51 編集

> 10は0123456789の10個だと思いますが マニュアルを読もう。 > この引数3つを使ってどうやってint型の123456789を導いたか strtolのソースならここ↓にあるから読もう。丁寧なコメントがついてる。 http://www.ethernut.de/api/strtol_8c_source.html
carnage0216

2021/02/22 19:58

提供ありがたいのですが、もっと短くてシンプルなものはないでしょうか? あるいは私でもわかるシンプルなプログラムを書いて頂くなどでも構いません。
carnage0216

2021/02/22 20:02

エピスさんにとっては親切に見えても私にとってはちんぷんかんぷんで。 期待に沿えず申し訳ないです。
episteme

2021/02/23 00:25 編集

> どうやってint型の123456789を導いたかの過程が知りたいです、 文字列:"1234" を数値:1234 に変換する方法が知りたい? strtolのからくりが知りたいのではない?
otn

2021/02/23 00:50

> 私にとってはちんぷんかんぷんで。 ポインタの理解が足りないのでしょうかね?だとすると説明も困難です。
carnage0216

2021/02/23 02:02

>>strtolのからくりが知りたいのではない? からくりが知りたいです。
carnage0216

2021/02/23 02:03

>>ポインタの理解が足りないのでしょうかね?だとすると説明も困難です。 基礎不足で申し訳ありません。
episteme

2021/02/23 02:17

細かな部分を端折ってキモの部分だけを書くことはできるけど...やめておこう。
退会済みユーザー

退会済みユーザー

2021/02/24 00:51

基礎すらろくに理解していないのに、標準関数の中身を知ろうとするのに無理があります。 開発言語より先に、まずは利用規約や非推奨事項の確認、そして紹介されているドキュメント等を読めるように、国語の勉強から始めた方が良いでしょう。(別に煽りでも何でもなく、本心です) 基本的な決まり事すら守れない人間が、人に何かを教わろうなど言語道断です。
guest

回答4

0

この引数3つを使ってどうやってint型の123456789を導いたかの過程が知りたいです

逆質問にはなりますが、何のために知りたいのですか?

むしろ、「指示された通りの引数を渡せば期待通りの結果を返す」ので中身を考えなくてもいいというのが、ライブラリ関数のメリットだと思っていたのですが、carnage0216さんにとってはそうではないのでしょうか?

投稿2021/02/22 22:35

maisumakun

総合スコア145967

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

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

carnage0216

2021/02/23 02:10 編集

ありがとうございます。 >>逆質問にはなりますが、何のために知りたいのですか? 純粋な興味と好奇心です。どう組んでるのかなとか読めないのにそう疑問が湧いてきます。 >>「指示された通りの引数を渡せば期待通りの結果を返す」ので中身を考えなくてもいいというのが、ライブラリ関数のメリットだと思っていたのですが おっしゃる通り、一理ありますね。。。 でも中身の処理をどうやって書いてあるのか、読めないしのに気になる。。。 自分自身、厄介なものです。
maisumakun

2021/02/23 02:19

> どう組んでるのかなとか読めないのにそう疑問が湧いてきます。 でしたら、実際のコードを元に「この部分が理解できない」というような質問にしましょう。極端な話、この機能がOSにある環境であれば、そのOS用の標準Cライブラリは「OS側のAPIに丸投げするだけ」という実装でも構わないわけです。
guest

0

質問への回答ではありませんが、
http://www.ethernut.de/api/strtol_8c_source.html
episteme さんが質問への追記・修正で、 strtol のソースだと示されたものです。
そのコードにはバグがあります。

VC++ のように LONG_MAX が 2147483647 の環境で

C

1int main(void) 2{ 3 char *p; 4 const char *s; 5 long v; 6 7 s = "2147483650"; 8 v = Strtol(s, &p, 10); 9 printf("s=%p, s=[%s]\n", s, s); 10 printf("p=%p, v=%ld, errno=%d\n", p, v, errno); 11 12 s = "2147483648"; 13 v = Strtol(s, &p, 10); 14 printf("s=%p, s=[%s]\n", s, s); 15 printf("p=%p, v=%ld, errno=%d\n", p, v, errno); 16}

実行結果

text

1s=00007FF6400BD000, s=[2147483650] 2p=00007FF6400BD00A, v=-2147483646, errno=0 3s=00007FF6400BD038, s=[2147483648] 4p=00007FF6400BD042, v=2147483647, errno=34

LONG_MAX より 3 大きい 2147483650 は errno=0 で結果が -2147483646
LONG_MAX より 1 大きい 2147483658 は errno=34 で結果が 2147483647

gcc のように LONG_MAX が 9223372036854775807 の環境でも同様な実行結果になります。

C

1 s = "9223372036854775810"; 2 s = "9223372036854775808";

実行結果

text

1s=0x7f9533b79004, s=[9223372036854775810] 2p=0x7f9533b79017, v=-9223372036854775806, errno=0 3s=0x7f9533b7903d, s=[9223372036854775808] 4p=0x7f9533b79050, v=9223372036854775807, errno=34

コードのバグは 180行目で、修正方法は、

diff

1- if ((acc > cutoff || acc == cutoff) && c > cutlim) { 2+ if (acc > cutoff || acc == cutoff && c > cutlim) {

170行目にも同様の修正が必要です。

追記
質問への回答です。

char str[5] = "0123", *p; で
int b = strtol(str, &p, 10); の場合を説明します。

strstr[0] を指すポインタ です。str の値str[0] のアドレス です。
&pp を指すポインタ です。&p の値p のアドレス です。
10 は基数です。文字列が 10進数だとして int に変換してほしいということです。

これらの引数を用意して、main から strtol を呼び出すと、
呼び出された strtol は、次のように動きます。
・str[0] へのポインタがあるので、
str[0] の値である '0' を得て、そこから '0' を引いて int の 0 を得ます。
・str[0] へのポインタがあるので、次の str[1] の値 '1' から 1 を得ます。
・最初に憶えた int の値 0 を 10倍して、1 を足すと 1 になります。
・str[0] へのポインタがあるので、次の str[2] の値 '2' から 2 を得ます。
・覚えている int の値 1 を 10倍して、2 を足すと 12 になります。
・str[0] へのポインタがあるので、次の str[3] の値 '3' から 3 を得ます。
・覚えている int の値 12 を 10倍して、3 を足すと 123 になります。
・str[0] へのポインタがあるので、次の str[4] の値 '\0' を得ます。
これは数字ではないので変換終了。
・p へのポインタがあるので、p に str[4] のアドレスを入れます。
・int の 123 を返します。
main に返ると、strtol が返した 123 という値で b を初期化します。

これが strtol の動きを具体的に説明したものです。
基数が 10以外の場合どうなるか、次のコードで考えてみてください。

C

1#include <stdio.h> // printf 2#include <stdlib.h> // strtol 3 4int main(void) 5{ 6 char str[] = "0123"; 7 char *p; 8 int i; 9 printf(" str = %p, str = [%s]\n", str, str); 10 i = strtol(str, &p, 16); printf("16: p = %p: i = %d\n", p, i); 11 i = strtol(str, &p, 10); printf("10: p = %p: i = %d\n", p, i); 12 i = strtol(str, &p, 8); printf(" 8: p = %p: i = %d\n", p, i); 13 i = strtol(str, &p, 2); printf(" 2: p = %p: i = %d\n", p, i); 14 i = strtol(str, &p, 0); printf(" 0: p = %p: i = %d\n", p, i); 15}

実行結果

str = 0x7fffd58dd6a3, str = [0123] 16: p = 0x7fffd58dd6a7: i = 291 10: p = 0x7fffd58dd6a7: i = 123 8: p = 0x7fffd58dd6a7: i = 83 2: p = 0x7fffd58dd6a5: i = 1 0: p = 0x7fffd58dd6a7: i = 83

投稿2021/02/23 09:27

編集2021/02/24 07:37
kazuma-s

総合スコア8224

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

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

Zuishin

2021/02/23 09:39

まだ話広げる気ですか?
carnage0216

2021/02/24 04:37 編集

質問によって得られたコードなので、質問とは関係ないというか少しあるというか、なんにしても バグの報告ありがとうございます。ですが、言える立場ではないですが、あくまで私の質問場所なので、エピステーメーさんのツイッターの方にDMで送ってくるとありがたかったですね。そっちに集中してしまい主軸がずれてしまうので。 でもどうせ私のことなので、是非、質問場所を利用して頂いても構いません。(運営さんに怒られない程度に。)
guest

0

関数とはそういうものでなのですね。

はいそうですね、以外の回答がないわけですが何を聞きたいのでしょう?

strtol系関数の適切な呼び出し方については
C言語で安全に標準入力から数値を取得 - Qiita
もどうぞ


とにかくmanページを読む癖をつけて下さい。そのうえでこの解説のこの部分がわからんとかであればまだ回答のしようがあります。全くわからないのだとしたら基礎知識が欠けていますから、適当な解説本を一通り読んで見るべきでしょう。前橋和弥氏の「C言語ポインタ完全制覇」を私からはおすすめしておきますが。


C言語では関数から複数のオブジェクトを返すには工夫が必要です。

  1. すべてのオブジェクトを含んだ構造体を返す
  2. 一つは戻り値として、残りは引数経由で返す
  3. なんらかのグローバルな、あるいはスレッドローカルな変数を用いる

strtol系関数はこの2番目と3番目の技法が使われています。2番目についてもうちょっと一般化した例を見てみることにします。

c

1#include <stdio.h> 2int foo(int* out) 3{ 4 if (NULL != out) { 5 *out = 23; 6 return 52; 7 } 8 else { 9 return 0; 10 } 11} 12int main(void) 13{ 14 int ret2; 15 const int ret1 = foo(&ret2); 16 printf("ret1=%d, ret2=%d", ret1, ret2);// => ret1=52, ret2=23 17}

上の例で関数fooから返却される値は戻り値のほかに引数outが指し示す領域を書き換えることで実現されるものがあります。今回の関数fooの呼び出しでは、呼び出し元(main関数)でint型の変数ret2を用意し、それへのポインタを取得します(&ret2)。これを関数fooの引数に渡していますね。こうすることで関数fooの引数outは呼び出し元(main関数)のint型の変数ret2を指し示すポインタとなっています。ここで*out = 23;のようにポインタをデレファレンスすることで、呼び出し元(main関数)のint型の変数ret2を書き換えられるのでした。

ではstrtol系関数に近づけてみましょう。簡単のためにunsigned intにパースすることを考え、かつ間違っても天と地がひっくり返っても実際にこのコードが使われることがないように祈りを込めて関数名も「劣った」を意味するinferiorと「安全ではない」を意味するunsafeを含めておきました。

c

1unsigned int inferior_unsafe_strtoui(char const* p, char const** endptr/*, int base 10進数を仮定するので省略 */) 2{ 3 bool conversion_started = false; 4 unsigned int ret = 0; 5 size_t i; 6 // endptrを通じて呼び出し元の値を書き換える。「2. 一つは戻り値として、残りは引数経由で返す」に該当 7 if(endptr) *endptr = p; 8 for( 9 i = 0; 10 // null文字終端 11 '\0' != p[i] 12 && ( 13 // -から始まる場合はstrtoul関数同様符号反転させるため読み飛ばす。+から始まる場合は読み飛ばす 14 NULL != strchr("+-", p[i]) 15 // 先頭の空白は読み飛ばす 16 || (!conversion_started && isspace(p[i])) 17 // C規格では文字コード上で0~9が連続することを保証する 18 || ('0' <= p[i] && p[i] <= '9') 19 ); 20 ++i 21 ) { 22 // 先頭の空白は読み飛ばす 23 if (!conversion_started && isspace(p[i])) continue; 24 // 空白以外が来たのでフラグを変更 25 conversion_started = true; 26 // +-は読み飛ばす。for文の条件よりp[i]はNULL文字ではない 27 if (NULL != strchr("+-", p[i])) continue; 28 // retを10倍できないとき 29 if (UINT_MAX / 10 < ret) { 30 // 結果の値が範囲外である 31 // errnoはglobalないしthread local変数なので、「3. なんらかのグローバルな、あるいはスレッドローカルな変数を用いる」に該当 32 errno = ERANGE; 33 return UINT_MAX; 34 } 35 ret *= 10; 36 // 文字から整数への変換 37 const unsigned int digit = p[i] - '0'; 38 if (UINT_MAX - digit < ret) { 39 // 結果の値が範囲外である 40 // errnoはglobalないしthread local変数なので、「3. なんらかのグローバルな、あるいはスレッドローカルな変数を用いる」に該当 41 errno = ERANGE; 42 return UINT_MAX; 43 } 44 ret += digit; 45 } 46 // endptrを通じて呼び出し元の値を書き換える。「2. 一つは戻り値として、残りは引数経由で返す」に該当 47 if(endptr) *endptr = p + i; 48 return ret; 49}

https://wandbox.org/permlink/urDikZ0Nn7YyAceN

これでstrtolがいかにして値を返却しているかわかるかと思います。

投稿2021/02/22 21:46

編集2021/02/23 05:21
yumetodo

総合スコア5852

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

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

carnage0216

2021/02/23 02:05

どうもありがとうございます。
guest

0

まず、引数10は10進数だからです。たとえば、16進数ならば16とします。当然、この数値次第で戻り値が変わります。たとえば、「10」という文字列は基数によって数字としての意味が変わります。

そして引数pは意味がありません。これは読み取れない記号があった時に意味を持ちます。たとえば、「12」という文字列を2進数として読み取ろうとした場合に意味が現れます。

投稿2021/02/22 20:54

HogeAnimalLover

総合スコア4830

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

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

HogeAnimalLover

2021/02/22 21:07

失礼、引数pですが、意味がないとは言い切れませんね。「読み取れない記号がない」、「文字列全体を10進数として解釈可能」ということを示すことができます。
carnage0216

2021/02/23 02:10 編集

ありがとうございます。 >>引数10は10進数だからです。たとえば、16進数ならば16とします。当然、この数値次第で戻り値が変わります。 参考書や説明を載せたサイトよりも短く、すごくわかりやすいです。こういう私にでも理解しやすい本があればいいのですが、どの参考書も気難しく書いているので皆さんの助けなしにはろくに関数を使えないし、理解できません。 >>そして引数pは意味がありません。これは読み取れない記号があった時に意味を持ちます。たとえば、「12」という文字列を2進数として読み取ろうとした場合に意味が現れます。 なるほど、ちゃんと理解できたか心配ですが、12の二進数は1100と普通に読み取れるので特に読み取れないということはないと思うのですが。。。関数strtol整数を二進数として読み取れないとかですかね。。。
maisumakun

2021/02/23 02:15

> なるほど、ちゃんと理解できたか心配ですが、12の二進数は1100と普通に読み取れるので特に読み取れないということはないと思うのですが。。。 入力された文字列の中に、「!」のような何とも解釈できない文字が入っていた場合の話です。
episteme

2021/02/23 08:35 編集

> 12の二進数は1100と普通に読み取れるので ちがう、「12を二進数表現:"1100"にする」ではない。 「"12"を二進数の文字列表現としたとき、数値に変換する」であり、それは不可能だ。 二進数に2は現れないから、「2」は「!」と同じく何とも解釈できない文字である。
carnage0216

2021/02/23 03:23

>>入力された文字列の中に、「!」のような何とも解釈できない文字が入っていた場合の話です。 なるほどです!
carnage0216

2021/02/23 03:28

strtol(str, &p, 10);より第2引数は&pで、意味はポインタ変数pのアドレスを得るということだと思いますが、プログラムではchar* p;とされただけで、ポインタ変数pには何も値も数列も入っていません。 なぜ引数としてpのアドレスを得るのでしょうか?
episteme

2021/02/23 03:33

strtolは変換できなかった文字の位置をそこにセットする。
maisumakun

2021/02/23 03:41

> なぜ引数としてpのアドレスを得るのでしょうか? ポインタのpを書き換えるために、ポインタのポインタが必要です。
carnage0216

2021/02/23 04:06

すいません。お二方の解答をうまく理解できませんでした。 あの逆にどんな文字列の時にprintf("変換失敗\n");となるのか教えて頂けますか。
maisumakun

2021/02/23 04:08

> すいません。お二方の解答をうまく理解できませんでした。 あの逆にどんな文字列の時にprintf("変換失敗\n");となるのか教えて頂けますか。 むしろ、それが知りたい質問だと判断できませんでした。
episteme

2021/02/23 04:11

お願いだからマニュアルを読もう。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strtol.3.html long int strtol(const char *nptr, char **endptr, int base); 「endptr がヌル値 (NULL) でない場合は、最初に現れた不正な文字が strtol() によって *endptr に保存されている。 文字列に有効な数字がひとつもなければ、 strtol() は nptr の元の値を *endptr に代入する (そして 0 を返す)。 特に、*nptr が '\0' 以外で、返された **endptr が '\0' ならば、文字列全体が有効だったことになる。」 とある。
thkana

2021/02/23 04:13

アドレスとは、またポインタとは何者で、どう使うかがわかっていないから話が通じないのでは?
carnage0216

2021/02/23 04:32 編集

>>お願いだからマニュアルを読もう。 読んで理解できないから質問したのです。読んで理解できるほどの頭があったらここにいませんよ! 楽しようとして質問したり、頼っているわけではないんです。エピスさんは私の読解力を知ってるでしょ?実際に会ったこともあるんだから。マニュアル読んでも理解できるほどの人じゃなかったでしょ私は。 ですが、せっかく書いて頂いたので、多分理解して頂けないとは思いますが。 書いて頂いたリファレンスを私なりに理解すると、まず、第二引数がnullでない場合、&pよりポインタpのアドレスを得る。そして、そのアドレスに文字列"0123456789"の(先頭の)アドレスが収納する。そして、strに入った(先頭の)アドレスの文字列と第二引数に入った(先頭の)アドレスの文字列を比較し問題がなければ10進数の数値として出力する。でしょうか?
episteme

2021/02/23 11:03 編集

char str[] = "0123456789"; char* p; int b = strtol(str, &p, 10); プログラマの意図: 「strtolさん、strに10進表現の文字列が入ってるんで、数値に変換して返してください。 変換できない文字を見つけたらその位置(アドレス)をpにセットしてください。」 if (p == str) {//一文字も変換出来なかった、要は変換できたデータ数が0だった printf("変換失敗\n"); } 「え? しょっぱなから変換できなかっただと? そりゃ大変だ"変換失敗\n"とプリントしよう」
episteme

2021/02/23 05:01

if ( *p == '\0' ) { printf("%d\n", b); } 「変換できない文字はひとつもなかったか。よしよし、結果をプリントしよう」
HogeAnimalLover

2021/02/23 05:05 編集

たとえば、strが"abc123"とか"123abc"で10進数としたとき、pは’a’の位置を示します。要するに数字として認識できない最初の位置を示します。したがって、「p==strが満たされる」ということは、「先頭の文字が0-9以外である」を意味します。
yumetodo

2021/02/23 05:24

ちなみにerrnoの値もみないとだめですけどねぇ、真面目にエラー処理するときは。
carnage0216

2021/02/23 06:54 編集

エピスさん >>プログラマの意図: 「strtolさん、文字列strに10進表現の文字列が入ってるんで、数値に変換して返してください。 変換できない文字を見つけたらその位置(アドレス)をpにセットしてください。」 今までの解答の中で本当にすんごいわっかりやすいです。なんで今までそうやって説明してくれなかったんですか?
Zuishin

2021/02/23 06:56

人間でないものを擬人化して話しかけるのは幼稚園児相手の手法なので大人相手にはめったに使われませんね。
Zuishin

2021/02/23 07:08

園児は園児扱いされても怒りません。彼らは自分たちが園児であるとはっきり認識し、大人は賢く経験もあり、大人の言うことを聞かなければいけないと思っているからです。 園児のように扱ってほしいのであれば、園児扱いされても怒らず素直に言うことを聞く謙虚さが必要だと思います。
episteme

2021/02/23 15:11 編集

> なんで今までそうやって説明してくれなかったんですか? 相手に対しあまりに失礼なので。(今回已む無く) 小学生相手のプログラミング教室ならこう説明しただろう。 こんな表現ばっか目にしているとますますマニュアルが読めなくなるだろう、そうなってほしくない。 ※ この説明が気に入ったなら、今後コードのコメントにはこんな説明書くといいよ。
episteme

2021/02/23 08:46 編集

「最初に現れた不正な文字が strtol() によって *endptr に保存されている。」がわかんなくて 「変換できない文字を見つけたらその位置(アドレス)をpにセットしてください。」がわかりやすいのか... 前者から後者への変換がアタマの中でできないのか。 失礼だとは思うが、あなた おいくつ?
knteil

2021/02/23 12:38

Zuishinさんの仰るとおりだと私も思いますね。 ここをどう返してくるか。 謙虚に学ぶ姿勢を見せてくれるんでしょうか。。
carnage0216

2021/02/24 03:55 編集

>>相手に対しあまりに失礼なので。(今回已む無く) 小学生相手のプログラミング教室ならこう説明しただろう。 こんな表現ばっか目にしているとますますマニュアルが読めなくなるだろう、そうなってほしくない。 ※ この説明が気に入ったなら、今後コードのコメントにはこんな説明書くといいよ。 なるほど、エピスさんなりの「教え方」があったのですね。だとしても私の出来の悪さを察して、幼児に教えるくらい優しく教えてくれた方が私としては親切な方だなと思いました。 また、私のような出来の悪い人にも「相手に対して失礼なので」という理由で簡単に説明をしてくれなかったものの、私でも理解できるわかりやすい説明ができるならばやはりエピステーメーという名前はエピスさんに相応しいと思います。(ん?ただ私の出来の悪さを知っておきながら気難しい説明を何年もしていたあたりは若干エピステーメーとは言えないと思いますが。)以前は相応しくないなどと言って申し訳ありませんでした。 こんな風に幼児に教えるくらいわかりやすく丁寧に関数の扱いを説明してくれる本があればよかったのにな。。。
fana

2021/02/24 03:57

> 幼児に教えるくらいわかりやすく丁寧に関数の扱いを説明してくれる本 需要が無いから存在しないのだと思う. 園児や幼児にC言語を教えるような状況って無いでしょうから. 最近は小学生にプログラミングの授業がどうのこうのとかいう話があるらしい(?)ですが,それだっていきなりC言語とかじゃないでしょうし.
m.ts10806

2021/02/24 04:02

こどもをかなり舐めてるようですけど、幼児並の学習能力と成長意欲と素直さがあればとっくに質問することなく、質問するにしてももっと高い確度でやっていけています。 自分を高く見積もるのをやめたらいい。口だけじゃなく。
carnage0216

2021/02/24 04:15

>>需要が無いから存在しないのだと思う. 園児や幼児にC言語を教えるような状況って無いでしょうから. ま、たしかにそうですね。私には需要はありますがw
fana

2021/02/24 04:53

「そういう物が存在しない(何故なら要らないから)」という世間の現状の側を変えることはできないでしょうから, これはもう,あなたの側が世間の想定するレベルに達するしかないですよね.
Zuishin

2021/02/24 04:58

ジャンプして届かないバナナは踏み台を使うと取れるのではないでしょうか。 園児でも時間をかけて高校までの勉強をすれば高校生を想定した本が読めると思います。 まず踏み台を置けと教えてもらっているのに、それを無視してジャンプばかりしていたのでは、いつまで経ってもバナナは揺れるだけでしょう。
episteme

2021/02/24 05:17

あなたが上に登ってくるって選択肢はないのかい?
退会済みユーザー

退会済みユーザー

2021/02/24 05:39 編集

そこまで懇切丁寧に教えて欲しいなら、お金を出してそういう事をしてくれるメンターにでも依頼すればいいんじゃないですかね。質問サイトは質問者のスキル調べて段階踏んで教える訳ではないので、学習目的で利用するには不向きです。自分で情報を調べる分にはタダですが、一般的に教育を他人に依頼するのはタダではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問