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

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

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

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

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

3回答

1298閲覧

入力した文字を含んだ文章をtxtから読み込んで表示したい

KZK13

総合スコア43

C

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

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

1クリップ

投稿2020/06/30 09:44

編集2020/06/30 11:30

環境
visul studio 2019
DXライブラリ

Cで書いたこのプログラムで何がいけないのか全く分からくて積んでいます。
デバッグを書けても正常にファイルを読み込んでいるし、文字での比較も問題なくできているので何が原因かさっぱりです。
どうか何がいけないのか助言を頂けないでしょうか。
ちなみに、低評価を押すのはいいんですけど、その理由も教えてもらえるとありがたいです。今後の質問の仕方の改善のために。

問題:da.txtに「映画」を含んだ文章を保存し、「映画」と入力すると「映画」という文字を含んだ文章を表示するようにしたいです。ですが、「映画」と入力しても最後の行の文章が表示されるだけで意図した文章が表示されません。

さらに短くしたプログラムです。

#pragma warning(disable: 4996) #include "DxLib.h" #include <string> char String[256]; int InputHandle; int InputHandleA; int modoru = 0; int mozicount = 0; int gimonnlock = 0; int gimon = 0; int my_str2(const char* s1, const char* s2)//s1がs2を含んでいたら1を返す { //s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。 const size_t a = strlen(s2); //無限ループする。 for (;;) { //関数memcmpの返り値が0の時は一致した時なので、==0とする。 if (memcmp(s1, s2, a) == 0) return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。 //入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。 else if (*s1 == '\0') return 0;//入っていなかった //文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数?が繰り上がるようにした。 else ++s1; } } const char* str[100] = { "はい!" };//ここで文字を直接書いてるので、この文字のバイト数が各posmozi[]に入るだけ int frame[100] = { 10 };//次の一文字が出るまでのカウンタとして働いている、ここの数値を変えることで文字が一文字ずつ出るまでの間隔を設定できる。 int posmozi[100];//文字のバイト数が入る箱を表している。 int countS[100];//次の文字が出るまでのカウントするためのもの int z;//関数drawString外でも使えるように外にも定義を書いた。zの数値は関係なく、文字列が入った数列がif文により同じ変数zの時にframe[z]と同じになるまで+1されていったり、+2バイトor+1バイトされていくため、 //文字が一文字ずつ入っていく、なんでzの変数に値を入れて動かす必要がないのだ。ちなみにfor (z = 0; z < 3; ++z)で書いてしまうとキーAを押した際のif文に関係なく関数drawStringの最初のzどこかに値が入っただけで繰り返しを開始してしまうため、今回のように同じ変数zの時にフレームを利用して描画するようにした。 char c = str[z][posmozi[z]];//関数drawString外でも使えるように外にも定義を書いた。 void drawString(int z, int x, int y, int color) { c = str[z][posmozi[z]];//posmozi[z] if (countS[z] == 0 && c != '\0') posmozi[z] += IsDBCSLeadByte(c) ? 2 : 1; if (++countS[z] == frame[z]) countS[z] = 0; DrawFormatString(x, y, color, "%.*s", posmozi[z], str[z]); DrawFormatString(300, 300, (0, 0, 255), "countS[0]は%d", countS[0]); } int memory = 0; char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。 char buffer2[256]; char input[256]; char* p; FILE* outputfile; // 出力ストリーム int hyouzi = 0; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { SetGraphMode(1500, 780, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 // DXライブラリの初期化 if (DxLib_Init() == -1) return -1; SetFontSize(42); //サイズを42に変更 // 描画先を裏にする SetDrawScreen(DX_SCREEN_BACK); // キー入力ハンドルを作る(キャンセルなし全角文字有り数値入力じゃなし) //MakeKeyInputは開発者の方が一回呼び出せば使えるように作ったのでループ内には書かない。 InputHandle = MakeKeyInput(150, FALSE, FALSE, FALSE); //これで総計150バイトの文字データを保持できる。 // 作成したキー入力ハンドルをアクティブにする SetActiveKeyInput(InputHandle); // キー入力終了待ちループ // (ProcessMessageをループごとに行う) while (ProcessMessage() == 0) { // 画面の初期化 ClearDrawScreen(); //まずは描画する部分から作る。 // 入力モードを描画 DrawKeyInputModeString(640, 480); // 入力途中の文字列を描画 DrawKeyInputString(0, 0, InputHandle);//InputHandleはint型とリファレンスに書いてあったんで //その後にif文での分岐を考える。 // 入力が終了している場合は終了 //ループ内とは言えエンターキー一回でCheckKeyInputが呼べればいい。 //エンターキーが押された時の部分。 if (CheckKeyInput(InputHandle) != 0) { hyouzi = 0; gimon = 0; ++mozicount; // 入力された文字列を取得、その文字列を数値に変換 GetKeyInputString(buffer, InputHandle);//ここでInputHandleに入力された文字列の数値をGetKeyInputStringにより文字コードに変換したものを上でchar型で定義したbufferに入れる。 //覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。 if (memory == 0) { outputfile = fopen("da.txt", "r"); // ファイルを読み込み用にオープン(開く) if (outputfile == NULL) { // オープンに失敗した場合 printf("cannot open\n"); // エラーメッセージを出して exit(1); // 異常終了 } //fgetsがNULLになるまで繰り返す //fgets(str,256,lf)!=NULL //と同じです。このように短縮することも可能 //★bufferには文字入力の文字列を入れたので、ここにはメモからの文字列は入れられない。なので新しくbuffer2を作る。 while ((p = fgets(buffer2, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer2の中に入れる。 { // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合 if (my_str2(buffer, buffer2) == 0) { hyouzi = 1; break; } // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致しない文字が出てきた場合 if (hyouzi == 0) { if (strcmp(buffer, buffer2) != NULL) { gimon = 1; } } } fclose(outputfile); // ファイルをクローズ(閉じる) } // 再度インプットハンドルをアクティブにする SetActiveKeyInput(InputHandle); // 入力文字列を初期化する SetKeyInputString("", InputHandle); } DrawFormatString(100, 300, GetColor(255, 255, 0), "bufferは%s,buffer2は%s", buffer, buffer2); DrawFormatString(100, 400, GetColor(5, 105, 0), "gimonは%d,hyouziは%d", gimon, hyouzi); //文字カウントが1の時 if (mozicount > 0) { drawString(z, 10, 100, GetColor(5, 255, 255)); } if (p != NULL or hyouzi == 1) { DrawFormatString(100, 500, GetColor(5, 105, 19), " buffer2は%s", buffer2); } if (hyouzi == 0 && gimon == 1) { DrawFormatString(100, 600, GetColor(5, 105, 0), "申し訳ありません%sとは何ですか?", buffer); } // 裏画面の内容を表画面に反映させる ScreenFlip(); } // 用済みのインプットハンドルを削除する DeleteKeyInput(InputHandle); // 画面の初期化 ClearDrawScreen(); // 裏画面の内容を表画面に反映させる ScreenFlip(); //ループないやループから出た後で何かしらの問題が発生したら終了する。 // DXライブラリの使用終了 DxLib_End(); // 終了 return 0; }

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

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

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

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

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

fana

2020/06/30 10:18 編集

コード長杉.(それを理由にして低評価はしないけども.) > 問題: に無関係なコードを完全に除去(というか,「問題:」の内容だけを実装)したコンパイル可能な最低限のコードを示すところから開始されたい. というのは,単純に「こんな長いの読めと?」というのもあるけれども, まずこれをあなた自身ができないならば,多分,本質的に解決しないと思われるから. これができるためには,頭の中にロジックが明確に存在する必要がある.
KZK13

2020/06/30 10:23

fanaさんありがとうございます。 これでもコンパイル可能な最低限のコードにしたつもりなのですが、もっと短くします。
episteme

2020/06/30 11:26 編集

低評価: 自分で作った関数の仕様を把握せず、問題解決を回答者に丸投げ。思考停止。 > int my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。 こんなコメントに意味はない。何を与えたら何が得られるか、つまり"仕様"をコメントに残せ。 「s1がs2を含んでいたら1を返す」ではないのか。
KZK13

2020/06/30 11:29

>>「s1がs2を含んでいたら1を返す」ではないのか。 コメントを編集します。
episteme

2020/06/30 11:36 編集

ならば誤りに気付くよね。SHOMIさんの回答そのままだ。 # コードに埋め込むコメントを再考せよ。長けりゃ/詳しけりゃいいというものではない。
KZK13

2020/06/30 11:42 編集

なるほど、自作関数の扱いがダメだったようです。 ですが、 if (my_str2(buffer, buffer2) == 1) としてみましたが以前と問題が解決できません。 またSHOMIさんとはどなたでしょうか?
episteme

2020/06/30 11:43 編集

> なるほど、自作関数に問題があったというわけでしょうか? なにが"なるほど"だ、お得意の独自解釈/拡大解釈か。自作関数の"使い方"が間違ってる。 > またSHOMIさんとはどなたでしょうか? 失礼な。回答ついてるだろが。
KZK13

2020/06/30 11:44

>>お得意の独自解釈か。 そういうのはよくないですね。 すいません、こちらの解答の読み込みが遅くて気が付きませんでした。 SHOMIさんすいません。
episteme

2020/06/30 11:46

>> お得意の独自解釈か。 > そういうのはよくないですね。 独自解釈でなかったら何だというんだ。 > if (my_str2(buffer, buffer2) == 1) としてみましたが以前と問題が解決できません。 独自解釈(これでうまくいく"はず")でなかったらこんなこと言うわけないだろが。
thkana

2020/06/30 12:14

問題に全く関係ないDXライブラリを質問(タグとプログラム)に含めているので低評価しようと思いますがよろしいでしょうか。
ikadzuchi

2020/06/30 12:44

> 低評価を押すのはいいんですけど、その理由も教えてもらえるとありがたいです。 低評価の理由はシステムメッセージで付くのでそれで十分でしょう。 (1件のみでは付きませんが、それは回答者の意見が一致していないということですから、ノイズとみてよいかと)
KZK13

2020/06/30 13:08

>>独自解釈(これでうまくいく"はず")でなかったらこんなこと言うわけないだろが。 関数以前に何か足りないのかもしれないですね。
m.ts10806

2020/06/30 21:03 編集

>関数以前に何か足りない 基礎と、全うなコミュニケーションと、ルールを守る当たり前のモラル 特にルールを守る当たり前のモラルは書いた通りにしか動かないプログラミングにおいては致命的(何度指摘されてるんでしょうねえ)
fana

2020/07/01 01:22

とりあえずコメント一番乗りで書いたコレ: > 頭の中にロジックが明確に存在する必要がある ここがもうダメなんだろうな,っていうのがコードを精査するまでもなくぱっと見の雰囲気で十分に伝わってくる. まず最初に,プログラミング言語ではなく,日本語か,フローチャート的な何かか,そういうので処理内容を整理し,具体化するステップを踏む必要があるだろう. さらにはそのコード化する前のフローの妥当性が第三者にチェックされるステップを経た方が良い.(これは,自身が第三者に具体的に明確に説明できる状況にまでたどり着けているか?という確認にもなる.) 上記は,実際に大学のTAとかそういうのも経験してきた中で,実際に行ってきたアドバイスである. このような雰囲気の人というのは「プログラミング言語を扱うこと」と「それ以外の部分」に複合的に問題を抱えがち.まず問題を両グループに仕分けるところから始める必要がある.
episteme

2020/07/01 03:49 編集

↑すごくわかる。 ウチの新人くんたちには 1. イカした設計しろ 2. その設計に忠実な実装をしろ 3. [2]で"あれ?"って思ったら1に戻れ というてます。 前段ゴミだと後段もゴミ。
shin1845

2020/07/01 05:26

頑なにDXライブラリを使用しているのには何か理由があるのでしょうか?今までの何となく動いてる気がしているような怪しいコードを使いまわす所為でよくわからないバグが出ているのでは?(すみませんコードはコメントが鬱陶し過ぎて読んでません) 一度フツーのコンソールプログラムとかにリファクタリングもかねて書き直してはどうでしょうか?
KZK13

2020/07/01 08:01 編集

ゴミで悪かったっすね。ゴミを見たくないならepistemeさん、二度と私の質問へ来ないでね。 あなたは結構な年なんだらストレスのたまるゴミコードを見て病気になりたくないでしょ? マウント取って質問者を馬鹿にしたいなら他に行けよ。いい年して中二病発言でのマウント取る説教恥ずかしいですよ。マジで。 epistemeさんの作る力はすごいものです。ですが、教える力もないしセンスもないのに新人に偉そうな口ぶりとは恐れ入ります。以前も行ったが評価が低いゆにpistemeさんの本はほんっとわかりにくい。そんな人間が下の人間に教えられるわけがない。そんでもって自分の納得いくイカした?コードでないとゴミ呼ばわり、こんな人に教えてほしいと思う人が減るのは当然だね。 こういう戦うのは強いけど、教えたりするのがことごとく下手で無能なアドバイス(フォースを信じろとかしかいわない)しかしないところがSWのヨーダに似ています。
episteme

2020/07/01 09:10 編集

> ゴミで悪かったっすね あ、認めた。
m.ts10806

2020/07/01 09:24 編集

「マウント」という表現を自ら使う人で、自身に非が全くなかった人を見たことがない。むしろ客観的に見て相手に非があることのほうが稀。 自身ができないことを他人や世の中のせいにするんじゃないよ。 大抵は要領や段取りの悪さだよ。自身の性質から見直しなさい。省みなさい。
KZK13

2020/07/01 09:47

>>あ、認めた。 逆に自分の書くコードが最高とでも思ってるんですか? そういう傲慢なところ直したほうがいいですよ。 epistemeさんのコードも使わなかったという意味ではある意味ゴミでしたね。
m.ts10806

2020/07/01 09:58 編集

>逆に自分の書くコードが最高とでも思ってるんですか? そういう思い上がり勘違い高慢なところなおしたほうがいいですよ。本当に。 なおせないから、なおす気もないからこの何年も同じところにいるんでしょう?口だけで結局他人のせいにしかしてないじゃん。
episteme

2020/07/01 11:12 編集

僕の書くコードは(書いたその時点では)最高よ。じゃなかったら改善の余地ありってことだから。 自分で最高と思えるコードを目指すのがプログラマじゃね? 自画自賛できるコードを書いてごらんよ。 # 「怠惰」「短気」「傲慢」はプログラマの三大美徳。お褒めにあずかり光栄です。
KZK13

2020/07/01 11:19

プログラマとはそういうものだったのか、それは知らなかった。 やっぱり本当にプロはすげえ。
m.ts10806

2020/07/01 11:21

「曲解」で辞書引いてごらんよ。あなたの人生そのもの。 当然、書いたようにしか動かないプログラムはできるようにならない。
episteme

2020/07/01 11:31

書いたようにしか動かないから、プログラムは己の鏡なんよね。
can110

2020/07/01 11:52

プログラマにとって「傲慢」とは誉め言葉。
episteme

2020/07/01 11:59

自画自賛もなにも、もらいもんのツギハギだからねー。 いやツギハギが巧いならそれは立派なスキルだけど。
guest

回答3

0

どうか何がいけないのか助言を頂けないでしょうか。

CもDXLibもMecabもすべて一旦置いて、Scratchで自分が思い通りのプログラムを作る練習から始めることをお勧めします。

ある言語で自分が思っているとおりのプログラムを作ろうとしたとき、次の三つが必要です。

  1. 論理的思考
  2. (その言語の)文法の知識
  3. (その言語の)動作の理解

KZK13さん、あなたにはこの三つとも欠けています。

一つ目の「論理的思考」はどの言語にも関係無く、共通して必要になる物です。まずは、これを身につけなければ、話になりません。「論理的思考」は最初から得意な人もいれば不得意な人もいます。この能力は他の学問、特に数学や物理などでも必要とされるもので、「論理的思考」は得意な人であれば、だいたい数学も得意です。逆もその然りで、数学が苦手という人は、「論理的思考」が苦手だったが故に苦手になったという場合が多いです(絶対そうであるというわけではありませんが)。数学が苦手だったりしませんでしたか?

この「論理的思考」は訓練次第で、ある程度までは身につけられます。それには、繰り返し、自分で考えるということが必要です。あなたの場合は、それがうまくいっているようには思えません。しかし、それは当たり前です。その後の二つに足を捉えられ、「論理的思考」の訓練に集中できない状態だからです。

二つ目の「文法の知識」ですが、Cはかなり文法が簡潔です。言語の中では、覚えることが少ない部類に入ります。ですが、C++になると途端に複雑さが増します。ここがちょっとややこしいところです。実は、Visual C++はC用のコンパイラではなく、C++用のコンパイラであると言うことです。そのため、Cだと思っていても、C++が混ざってしまい、より複雑な文法の知識が求められる場合があると言うことです。つまり、Visual C++で純粋なCを書くことは難しく、予期せぬC++の文法の知識が必要になると言うことです。例えば、あなたが何気なく使っているorは、Cにはない(正確には<iso646.h>をincludeしないと使えない)演算子の代替表現であると理解していますか?そういった所を一つ一つ理解していない状態では、一つ一つの文を解釈することすらできません。

とどめの三つ目の「動作の理解」が最も難敵です。Cをきちんと理解することは本当に大変です。まず、環境レベルでみると、ソースファイル、ヘッダファイル、オブジェクトファイル、静的リンクファイル、動的リンクファイル、実行ファイル、これらの関係性をちゃんと説明できますか?ソースファイルから実行ファイルが作られるまでに、プリコンパイル、コンパイル、リンクという課程を踏みますが、それぞれ一体何をしているのかわかっていますか?ボタン一つで、実行ファイルまで作られているように見えますが、その処理は単純ではありません。ひとたび、おかしな所が出たとき、処理の内容を知っていないとどの部分で失敗しているのかを知ることもできません。一連の流れが一つになっている言語と違って、Cは複雑です。

さらに、Cは動作の理解だけではなく、その動作自体にも注意事項が非常に多いです。メモリを直接扱う動作である故に、確保しているメモリ領域を越えたアクセスをしないようにするのはプログラマーの責任です。メモリは自分で確保し、自分で解放するなど、管理も全て自分で行う必要があります(C++ではスマートポインタというちょっと便利な機能はありますが、それを理解するにはスマートポインタ以外の動作の理解が必要です)。それらを全てを踏まえながら、注意深くコードを書いていかないと、思い通りに動くことはないのです。

はっきり言います。**Cは簡単な言語ではありません。**なかには、簡単だという人がいますが、そういうのは勉強しなくても東大に行くような別次元の人達のことです。そういった、簡単ではないところで、あなたは「論理的思考」を訓練しなければなりません。それでは、一体どこで躓いているのか、いま、うまくいってない原因は、1,2,3のどれが無いため起きているのかすら、わかりません。どれもできていないのだから、わからないのは当たり前です。

Scratchは2.と3.が極力必要が無いようになっています。「論理的思考」の訓練にもってこいと言うことです。今、あなたがしようとしていることをまずはScratchでやってみてください。それだけで、「論理的思考」の訓練になり、論理的な間違いがあるのかどうかが分かるようになります。

「論理的思考」ができるようになったら、次は2.と3.ですが、やはりいきなりCに戻るのは危険です。ここはPythonをお勧めします。まず、Pythonはスクリプト言語ですので、コンパイルと行った難しいことを考える必要がありません。ガベコレはメモリ管理の大変さから解放してくれるでしょう。これは3.の大幅軽減になります。Pythonはオブジェクト指向言語でもあるので、オブジェクト指向が必要になると思うかも知れませんが、Pythonはオブジェクト指向に特化した言語ではありません。オブジェクト指向は慣れた後にでも触れ始めれば十分です。

なにより、Pythonを進める理由はソースコードが誰が書いても綺麗にならざるを得ないと言うことです。あなたは、インデントについてちゃんと意識していますか?Cでは文法上インデントが必須ではないとして、ないがしろにしていませんか?どんな言語でもインデントは読みやすさをあげるために重要な物です。決して適当にして良いものではありません。そこでPythonです。Pythonでは正しくインデントしないと、そもそも動作しないようになっています。つまり、Pythonを書いていれば、自ずとインデントが綺麗になります。他にも、Pythonでは、より単純で、わかりやすいコードになる工夫がたくさん仕込まれています。

さて、Pythonも分かってきたところで、やっとCにとは、まだちょっと早いです。Cはそれほど複雑です。一旦Goあたりに寄り道したほうがいいと思います。GoはCのややこしい部分をなるべく無くしながらも、Cと同じぐらい強力な言語です。本当にややこしい部分を避けて、コンパイル言語の本質を知ることができるかと思います。

これらをやってからCに戻ってきてみて下さい。たぶん、3年ぐらいはかかるかと思いますが、Cだけを3年やっても現状から何も進まないよりは遥かにマシなはずです。あなたの人生なので、何にどれぐらいの時間をかけるのかはあなたの自由ですが、今のままではただ無駄に時間を過ごすだけです。寄り道だと思うかも知れませんが、急がば回れということわざもあります。もう一度言いますが、Scratchから始めることをお勧めします。

プログラミングの上達には作りたい物を作ることが一番と言われます。それが初めから成功するのはごく一部の天才達だけです。あなたが自分は選ばれし天才だというのであれば、私は止めませんが、そうでないなら、簡単なところから初めて行くことをお勧めします。


このままCだけをやり続けるのであれば、私がこれ以上あなたに言えることはもうないでしょう。いまのコードの問題点をどんなに説明しても、理解できるだけのレベルにあなたが達することがないからです。理解できるレベルまでになるための道筋は上に示したとおりです。それを選ぶか選ばないかはあなたの自由です。私は何も強制はしません。

投稿2020/07/01 14:03

raccy

総合スコア21739

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

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

KZK13

2020/07/01 14:29 編集

いや、もうやめます。ここまでしても何も身に使いないのは明らかに不向きな証です。 いろいろありがとうござました。私にはどの言語にしてもプログラミング自体が無理だととことんわかりました。 プログラミングは本当に大好きですが、周りに迷惑をかけて、かつ何も学習できないならば何の意味もないです。自分にはプログラミングが不向きだとわかっただけでも良かったです。
m.ts10806

2020/07/01 21:59 編集

何回目ですか。それ。 「どの言語にしても」ってほど触ったんですか。ひとつもまともに使えてない人が使っていい表現ではないですね。
raccy

2020/07/01 22:29

私はやめろともやめるべきとも言ってないのですが、そう結論づけるのであれば、それもあなたの自由です。ただ、その場で言うだけでやっていることとあっていない嘘つきになると、もう誰からも信頼されなくなるよとだけ忠告しておきます。
KZK13

2020/07/01 23:38

あの後、徹夜して小分けにして簡単なプログラムの状態から付け加えていき、思うように動かないところがないかをより細かくビルドやデバッグを繰り返したり、元の状態から部分的にわけていき、怪しい部分がないかとチェックしていき原因がやっとわかりました。 作った関数の使い方が間違っていたことがわかりました。 正直、原因を探るまで間と関数の中身を細かく読んでコメントしたりするのが、すごく楽しかったです。 もっともっと関数を扱えるようになればもっと自分の作りたいものが作れるのになと思いました。 ただ、不向きであることもわかりました。 やっと依然と比べればまだまともなデバッグのやり方ができるようになったとはいえ問題解決までの時間があまりにもかかり過ぎました。大好きなのに諦めなくてはならない出来の悪い脳しかなくてほんとに残念です。 このままやめるほうがいいのかなとも考えいます。
episteme

2020/07/01 23:52 編集

関数/構造体/ポインタ等々、自分の扱える道具を増やしていかないとキツいよ。 小刀一本で竹トンボは作れるだろうけど、犬小屋は無理だしごりごり作っても無様な出来栄えだろう。
m.ts10806

2020/07/01 23:57

やめる気がある人は匿名で質問サイトに同様の質問を投げるようなことはしません。 やはり、息をするより嘘つく
KZK13

2020/07/02 00:01 編集

raccyさん、epistemeさん、プログラミングって。 難しいけど思うように動くととても楽しいし嬉しいですよね。
episteme

2020/07/02 00:17 編集

↑↑ 知恵袋 / 教えてgoo / stack overflow で見かけた。
episteme

2020/07/02 00:38

SHOMIさんにはちゃんと報告して礼を述べて。
fana

2020/07/02 01:45

私はこの回答に低評価を押しました. 理由は,(内容の良し悪しとかではなく,単純に)この文面が「この質問への回答」ではないと見えるからです. (他者がこのような話に「回答」ではない欄を利用しているのにはそういう理由があるのではないかと.) まぁ,私の書いた物もその点では似たようなものではあるのですが,「ぎりぎり質問内容に沿うように」してはいるつもりです.
KZK13

2020/07/02 04:12

何でもかんでも私の質問にしないでくださいw ストーカースキル上げてないでプログラミングスキル上げたほうがいいですよ! どうあれ、ちゃんと解決できたんですから。
m.ts10806

2020/07/02 04:20 編集

>何でもかんでも私の質問にしないでください 戯れ言はプログラミング初心者になってからにしなさい。プログラミング以外も初心者未満じゃないか。
episteme

2020/07/02 05:07

何でもかんでもあなたの質問にされるに十分なだけ、マルチポストを繰り返してきたから仕方ない。
shin1845

2020/07/02 05:22

コメントの内容とか変数・関数名に癖があり過ぎて大体わかってしまうんですよね。自分がどれだけプログラマの常識・通常から逸脱してるか少し考え直した方が良いのではないかと思います。
raccy

2020/07/02 09:41

fanaさん はい、この回答は質問の回答にはまったくなっていないので低評価は妥当だと思います。ただ、それでも私が回答として書いたのは、「この質問を質問者が本質的に理解して解決できるようになる」ためには、問題部分を指摘するだけでは無理だと思ったからです。というより、コードをちゃんと理解できていれば、SHOMIさんの回答で、自ずと気づけるはずで、それで終わっているはずです。 これまで、質問者さんは難しいことや遠回しなヒントではわからないと何度も言っていました。しかし、実際の所、Cをきちんと分かっていれば、何も難しくない、遠回しでもなんでもないことばかりだったのをそのように言っていたのです。結局、理解できるほどの知識や力が全くついていない状態ということです。なので、まずは、回答を理解できるほどの知識や力を身に付かないと、何も解決にならないと思い、このような回答をしました。 今回も、自分でわかったような口ぶりをしていますが、今まで、それで本当に理解できていたことは一度もありません。単にうまくいったから、表面上は想定通り動いたから、はまだましで、対応が面倒だからできたことにしたを繰り返しているようにしか見えません。そもそも、自分で作った関数の使い方を間違うという時点で、本末転倒です。自分で作る関数は、自分が思った通りに使いたい仕様で実装する物であって、自分が決めた使い方を間違うというのはあり得ないことです。確かに、数ヶ月前や数年前に書いたとかなら、使い方を忘れているというのもありますが、ここ最近書いたばかりの関数で使い方を間違うなんてあり得るでしょうか?結局、自分で考えて作ったわけではない関数を、何も理解せずに、雰囲気だけで使おうとした結果というのが目に見えています。そのような状況で、本質的に解決できるはずがありません。 そういうこともあって、このような回答にしました。評価はそのままでも構いませんが、なぜ、これを回答に書いたのかをご理解いただければ幸いです。
fana

2020/07/02 09:56

意図はご説明頂くまでもなくわかるのですが, 残念ながら,質問内容よりもはるか手前の事柄を正すようなことは このようなサイトで扱う事柄の範疇を超えているのかもしれません.
fana

2020/07/02 10:10

どうやら今現在,「teratailからKZK13氏のコードを丸パクリしてみたけど,結局自身では動かせなくて,でもパクリ元のteratailで質問するわけにもいかないから,別のところで質問している」人たちが複数おられる様子. せっかくだから(?),回答とコメントを合わせて,その人たちにも読んでもらいたいですねこれは.
fana

2020/07/02 10:21

> そもそも、自分で作った関数の使い方を… 自身が{遠慮?, 我慢?}して回答の行間に葬ったような内容を他者にダイレクトに明文化されちゃうと,なんというか,ちょっと悔しい感じがしますね.
episteme

2020/07/02 10:44 編集

してみると > どうあれ、ちゃんと解決できたんですから。 も怪しいな。 ちゃんと解決したんならSHOMIさんへの返答に「ここが間違ってた/正しくはこうだった」を添えるはずなんだ。
m.ts10806

2020/07/02 10:57

この人(質問者とは言わない)からは「まいどあり!」という声しか聞こえない。 完全スルーで独りにするしかないんじゃないですかね。
KZK13

2020/07/02 18:47

すいません。気を失っていました。 では、なにが原因だったのか説明します。 以前のプログラムでは、正しくはif (my_str2(buffer2, buffer) == 1)のはずなのに、 if (my_str2(buffer, buffer2) == 1)と引数の部分が逆になっていたため、引数を扱っての関数my_str2の{}での処理がおかしくなってしまい思うよう結果が得られないとわかりました。 正しくif (my_str2(buffer2, buffer) == 1)と書いて、bufferに入力した文字をbuffer2が含んでいた場合にbreakすると書くことで臨む通りの処理ができました。 C言語の基礎も以前にもっと自分の書いた関数への理解があれば、このようなことで悩むことはなかったと痛感しています。そう考えるとraccyさんとfanaさんの言いたいことが理解できます。 特にfanaさんの意見は一番的を得ていると思いました。 というのも、自分で書いた関数の処理を正しく把握できず、致命的なミスを生むのは、どう考えてもプログラミングには向いていないし、自分にはプログラミングが無理なのだととことん痛感したためです。 epistemeさんからも優しさゆえに解答を頂いたりしましたが、自分のこのポンコツぶりではその期待に応えることができないと落ち込みました。 raccyさん、fanaさん、epistemeさん、こんなバカのせいで貴重な時間をとってしまい本当に申し訳ありませんでした。プログラミングを続けて行くべきかよく考えます。
episteme

2020/07/02 21:46

僕はコメントと命名に大きな問題があったと考えている。 > int my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。 > // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合 このコメントじゃ「どっちがどっちを含んだ時にどうなるか」わからん。 > if (my_str2(buffer, buffer2) == 0) { キーからの入力文字列を input, ファイルから得た文字列を memo とでもしておけば も少し早く気づけたんじゃね? 「わかった"気になる"コメント」 と 「テキトーな命名」があなたの足を引っ張っていると感じるし、 raccyさんの指摘にある 論理的思考 の邪魔をしていると思う。
KZK13

2020/07/02 22:20

>>キーからの入力文字列を input, ファイルから得た文字列を memo とでもしておけば も少し早く気づけたんじゃね? 確かに、ややこしい変数名は今後は付けないように、もっとわかりやすく見分けのつくようにします。 >>文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合 このコメントじゃ「どっちがどっちを含んだ時にどうなるか」わからん。 入力する文字列の入るbufferの文字列がメモからの文字列を読み取るbuffer2の文字列に含まれる場合と書いたほうが、入力された文字列が入るbufferに含まれる文字列をメモからbuffer2に入った文章がが含んだ時だとわかりますね。 わかりやすい変数名、関数に関しては関数に入る引数に番号を振り、その番号の引数がどのように処理されるのかの適切な説明を書く練習をしたほうがいいと考えました。
m.ts10806

2020/07/02 22:24

論理的思考に言及しないのは、理解できないから? 論理的思考力の低い人は日常生活で苦労するよ。今、まさに。 1日で済むことを何年やってるんでしょ。
episteme

2020/07/02 23:04 編集

> 関数に関しては関数に入る引数に番号を振り これは悪手じゃないかな。番号には「何番目」以上の意味を持たないから。 > int my_str2(const char* s1, const char* s2)// s1内にs2が含まれていれば非0を返す この場合番号は引数を区別する意味を持つのでOK テキトーなコードをコメントで説明するな。拙いコードをコメントで補強するな(てかできない)。 コメント不要と思えるまでにコードを磨き、しかるのちなおもコメントせよ。 コードの一行一行にコメントするな。コードの論理的な"処理のまとまり"に対し 「何をするか」「なぜそうするか」をコメントせよ。 詳しすぎるコメントは、コードを変更した途端に嘘をつく。 多少のコード変更では嘘とならないコメントを書け。 論理的思考 の前に 適切な言語感覚/言語表現 かもしれない。 > 入力する文字列の入るbufferの文字列がメモからの文字列を読み取るbuffer2の文字列に含まれる場合と書いたほうが、入力された文字列が入るbufferに含まれる文字列をメモからbuffer2に入った文章がが含んだ時だとわかりますね。 これ、冗長だとは思わない? "なに質問してんだかわかんない" とか "なに説明してんだかわかんない" とか言われてない?
KZK13

2020/07/02 23:53

>>> int my_str2(const char* s1, const char* s2)// s1内にs2が含まれていれば非0を返す この場合番号は引数を区別する意味を持つのでOK このくらいシンプルなのがいいですね。 >>コードの一行一行にコメントするな。コードの論理的な"処理のまとまり"に対し 「何をするか」「なぜそうするか」をコメントせよ。 内容と目的のみを書くのですね。わかりましたといいたいですが、いきなり実行できるほどの頭がないので、難しそうです。しかし、第三者に答えてもらえるようにするには今のコメントのままでは駄目ですね。 >>これ、冗長だとは思わない? "なに質問してんだかわかんない" とか "なに説明してんだかわかんない" とか言われてない? たまに、言われます。頭の中で言葉がうまく整理できていなのでしょう。
episteme

2020/07/03 00:36

質問/説明/コード/コメント...なんにせよ「伝わらんことには始まらん」のだから表現には気を付けよう。 # "推敲"って...やってる?
KZK13

2020/07/03 00:47

推敲、やってます。ですが、プログラマーの皆様の理解に沿う文が作れていないです。
m.ts10806

2020/07/03 00:52 編集

自分が理解できてないから当然 人に説明できないのは自分が理解できてないから 自分が理解できないのはプログラミング含めてコミュニケーションの基礎がないから 基礎を身に付けられないのはルール守るという至極当然のことをスルーするから 私のコメントを無視するのは自身にとって都合が悪いから。
episteme

2020/07/03 01:12 編集

フツー「俺がわかれば他人もわかる」はざっくり正しいんだけど、 あなたの場合そうではないんだろうな。 m.ts10806さんの指摘:「俺がわかってないから他人にわからせられない」の可能性も十分にアリ。
KZK13

2020/07/03 01:27

プログラマーの方ははいい意味で特殊で賢い方が多いので、特殊で賢くないわたしにはついていけない世界なのかもしれないとは思っています。しかし、先ほどのようなシンプルでわかりやすい説明をしていこうとは思います。(どうしたらいいのやら)。epistemeさん、ありがとうございます。
episteme

2020/07/03 01:46 編集

> プログラマーの方ははいい意味で特殊で賢い方が多いので まーた他人に原因を求める... できない理由を探しても(それが自分ではどーにもならんなら)解決につながりはしない。 # 慰めにはなるがな。
fana

2020/07/03 01:35

季節の問題なのか何なのかよくわかりませんけども,ひょっとして,文章を読んだり書いたりする能力に揺らぎがありませんか? 質問文が普通の日本語になっていることもあれば,他者には意味がとれないような状態になっていることもある様子で,謎です. その理由を明らかにする必要はありませんが,調子が良い時期と悪い時期が存在するのであれば,調子が良い時期を選んで取り組むようにしてみてはどうかな,とか. (常に妥当なコメントを書いておく(とか,わかりやすい変数名等にしておくとか)というのは,特にそういう場合に役立つ.)
m.ts10806

2020/07/03 01:42

>どうしたらいいのやら いつの間にかプログラミングやめる話が消えてて笑った。べつに誰も止めないしすすめもしないけど、自身の発言くらい責任持とうや。 所詮嘘つきの妄言ということで、解散。
KZK13

2020/07/03 01:53 編集

>>まーた他人に原因を求める... 私自身の問題なのに相手に考えさせては駄目ですね。(一番の原因は自分だとは認識しています。) >>ひょっとして,文章を読んだり書いたりする能力に揺らぎがありませんか? 揺らぎしかないですね。なので、コメントの書き方はepistemeさんやfanaさんを真似るようにして書いていくしかないです。真似できればいいのですが。 >>調子が良い時期と悪い時期が存在するのであれば,調子が良い時期を選んで取り組むようにしてみてはどうかな 確かに、周りに迷惑を書けないようにもそうするようにします。
episteme

2020/07/03 02:00

"真似どころ"がどこだかわかってる? あなたのコメントは「コードの実況中継」になってると感じる。 コードが実況してくれるから、コメントは解説しろ。
KZK13

2020/07/03 02:14

>>"真似どころ"がどこだかわかってる? コードの解説は「何をするか」「なぜそうするか」のみのコメントだけにします。
fana

2020/07/03 02:30

> 「何をするか」「なぜそうするか」のみ (自分の回答の方のコメント欄にも書いたけども) そんな何かの原理主義っぽく構えなくとも, 「コードを読む人が把握せねばならない事柄を,その読み手にわからせるために」必要な事柄を過不足なく書くというだけだよ. 「読み手」の第一号は常に自分自身.自分にとって「不足」なら,それは良くない.
KZK13

2020/07/03 02:53

>>「コードを読む人が把握せねばならない事柄を,その読み手にわからせるために」必要な事柄を過不足なく書くというだけだよ. 確かに、そうです。それが今後できればいいのですが、できないのに無責任に頑張ります!とも言えないですし。とにかくコメントスキルを上げないといけないです。 >>「読み手」の第一号は常に自分自身.自分にとって「不足」なら,それは良くない. 自分用のコメントと相手に読んでもらえる用の二つのコメントでは駄目でしょうか? やはり、自分用と相手用ではコメントが多いでしょうか?
episteme

2020/07/03 03:00 編集

コメントがんばるのもいいけどさ、コードが主役なんだからコメントに頼らないコードを目指してね! # そっちが優先よ? コメントはいくらきれいに書こうが汚く書こうが動きゃしないんだから。
fana

2020/07/03 03:07 編集

・どうみても個人の趣味のプログラムだろうから「他人に見せるためのコメント」は本来存在しなくてよい物. ・どうしても他人に見せねばならない際には,コードに書くコメント以外の手段もある.例えばこのような場ならば,質問文で補足できる. ・自分用に書いたコメントというのが,相応にまともでさえあれば,通常はそのまま他人にも通用する. ・大抵,こういう場で質問する場合には,自分のコードをそのまま丸出しにしないだろう(最低限の状況が再現できるコード という,自分の本物のコードとは別の,質問用のコードを用意する)から,「相手用」というのは自身の本番コードに付すものではないハズ. > できないのに無責任に頑張ります!とも言えないですし このような場で他者に何かを宣言すること自体が不要に思える.自身に必要な事柄を粛々とやればよい.
m.ts10806

2020/07/03 03:47

リーダブルコードという新卒社員御用達の名著が。
fana

2020/07/03 04:02

(でも,お高いんでしょう?)
KZK13

2020/07/03 04:22

>>コメントがんばるのもいいけどさ、コードが主役なんだからコメントに頼らないコードを目指してね! # そっちが優先よ? コメントはいくらきれいに書こうが汚く書こうが動きゃしないんだから。 その通りであります。要領が悪くてすいません。 fanaさんの言うように、質問する場合は相手側が再現できるように最小限のコードで理解しやすいコメントを目指すようにします。epistemeさん、fanaさん親切に教えてくださりありがとうございます。
m.ts10806

2020/07/03 05:01

自分で考えても、他人に教えられてもむずかしいなら、広く読まれてる書籍を利用するしかないんですけど、それすら無視すらならあなたの立場がどんどんマズくなって、誰からも無視されるようになるわけで。 孤独がお好きなんでしょう。 全てチームプレーで成り立っているというのに。
m.ts10806

2020/07/03 05:03

fanaさん 我々のような自身の理解に遠く及ばない人たちをいつまでも(一部を意図的に無視しながら)多数相手にしなくて済むようになるなら、安いもんでしょう。 我々のリソースも無駄に喰われなくて済むし、win-winです。
episteme

2020/07/03 06:06

リーダブルコード、あれはいい本だ。 「凡庸なコードを書け」にはぐっときたwww
raccy

2020/07/03 09:46

KZK13さん 各コメントでは話がずれてきていますが、結局あなたはこれからどうするのですか?最初はやめますと言っていたのに、コメントを頑張りますと言い始めたり、言動が一貫してないように思います。これでは、言っていることが毎回違うただの嘘つきです。なので、今後どうするのかをはっきり宣言して貰えませんか?選択肢は次の四つです。 1. プログラミングをやめる。 2. Cでプログラミングを続ける。 3. C以外の言語でプログラミングを始める。(Scratchに限らず、別のどんな言語でもよい) 4. その他 (上記以外の私には思い浮かばない何かをする) どれを選ぶのもあなたの自由です。誰も強制はしていません。○○したいという願望ではなく、あなたがこれからしていくことをはっきりさせて下さい。あなたが、これから何をするのかがわかれば、私も含めて、他のみんなはもっと適切なアドバイスができる(または、これ以上自分にアドバイスはできないとして去る)ことができます。見当違いのアドバイスを貰ってもKZK13さんも困りますよね? ぜひ、1~4のどれを選ぶのかを宣言していただきますようお願いします。
KZK13

2020/07/03 14:36

話がぶれてしまいすいません。 プログラミングが続けたいです。ですが、私の問題はプログラミング言語以前の問題が多い気がして、 こればかりはどうにもできないため、プログラミングに対する好意は大きいですが、その反面これからどうしていいかわからないという部分も大きいです。 なので、1と4のはざまといった感じです。あいまいで申し訳ないです。
raccy

2020/07/03 19:27

願望は聞いていません。 自分がこれから何をするのかすら決められないというのであれば、私はこれ以上何も言うことはありません。
guest

0

とりあえず今後のためになると思うアドバイスを.

int my_str2(const char* s1, const char* s2){...}

もっとこう,

  • 関数の名前
  • 引数の名前
  • 注釈

を工夫して,間違った使い方を防ぐことを考えましょう.
例えば,

//文字列Strの中に,文字列Keywordが含まれているかどうかを判定する. //含まれていない場合には0を,含まれている場合には0でない値を返す. // //・StrがNULLの場合は…(どうなるのか?を記す) //・StrがNULLでないとして,Keywordの方がNULLだったり空文字列の場合には…(どうなるのか?を記す) int IsKeywordIncludedInStr( const char *Keyword, const char *Str ){ ... }

とかだったら,これだけでも関数呼び出し側をミスる可能性が減ると思いませんか?

この例の注釈の後半に書かれているような話(NULLだったらどうなるとか)も,必ずしっかりと仕様を定めて明記しましょう.
そうすれば,呼び出し側がnullや空文字列なんかを引数に突っ込んでいる場合に,

  • そもそも突っ込んで良いのか悪いのか
  • 突っ込んだ結果として返ってきた戻り値は正当な値なのか違うのか

といったことが明確になります.
「動作がおかしい」場合に,どこがバグっているのか(呼び出し側が悪いのか,それとも関数の実装が悪いのか)という線引きが可能になります.

投稿2020/07/01 08:43

fana

総合スコア11996

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

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

KZK13

2020/07/01 11:27

解答者様の理解しやすいコードとなるように、またコメントも短くわかりやすく書きたいです。
fana

2020/07/01 11:33

現コードでもこういうことをやっていけば,(その過程であなた自身が) 現my_str2()の呼び出し側に異常があるならばそれに気付けるハズ. 呼び出し側のチェックは「定められた仕様通りに関数を使っているかどうか」,すなわち, {戻り値の意味,引数の順序,引数の中身,...}に関して間違った指定の仕方や値の意味の解釈等をしていないかどうか を確認すればよいわけだ. 仕様を不明瞭なままにして「関数の内側の具体実装」の事情/状況に,関数を呼び出す側のコードを合わせていくようではいけない. (そういうやり方は泥沼.)
thkana

2020/07/01 11:37

解答と回答はちょっと(あるいは随分)違うものだったりする。
fana

2020/07/01 11:39

本稿が,質問者がSHOMI氏へ妥当な応答をするための役に立てば幸いである.
fana

2020/07/03 02:02

> またコメントも短くわかりやすく書きたいです。 コメントの「長さ」に関しては,気にしない方が良いです. 長い=悪い わけではないです. ・必要な情報を書かないならばコメントを書く意味がありません. ・無理矢理文章を短くしようとして,結果として明確さが減る(誤解しやすくなる,意味がとれなくなる)のであれば,長い方がマシです.むしろ{主語,述語,目的語}等を省かないことを心がけるべきです. ・そもそも「書くべき事柄」には限りがあるのですから「書くべきではないこと」をわざわざ書かない限りは放っておいても,そんなに長くはなりませんし. > 解答者様の理解しやすいコードとなるように 「必要な情報を書かないならば…」と書きましたが,「誰にとって」必要なのか? というのを間違わないように. このような場で他者にコードを見せる場合には「他者にも」わかる必要がありますけども, まずは,「自分自身が」理解できる状態を作り上げることに意味があるので,コメントはその目的のために書いてください. (極論, 自分自身がわかる→ならばミスらない→ミスらないならどこかで質問することもない→つまりコードを他者に見せることはない, ということになりますしね.)
guest

0

ベストアンサー

my_str2()は一致する文字列があった場合は1を返すようですが、この判定でよいのですか?

C

1 // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合 2 if (my_str2(buffer, buffer2) == 0) { 3 hyouzi = 1; 4 break; 5 }

投稿2020/06/30 10:54

編集2020/06/30 11:26
SHOMI

総合スコア4079

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

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

KZK13

2020/07/02 04:12

一番参考になったのでベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問