1 名前:デフォルトの名無しさん [2011/12/23(金) 22:51:14.19 ] C言語の*入門者*向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 93 toro.2ch.net/test/read.cgi/tech/1322866566/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 154代目 hibari.2ch.net/test/read.cgi/tech/1322562648/ ★C++言語については避けてください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 長くなりそうなコードはcodepadに貼り付けてもいいでしょう codepad.org/
581 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 23:43:16.72 ] >>577-579 四捨五入はprintfがやってくれるので問題ないみたいです +0/-0が関係あるのかと思って-0を+0にしたりしてみたんですがダメみたいですね
582 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 23:48:12.56 ] >>581 1入力(a b c d e f)で1出力ではなく、複数入力に複数出力では? sample inputは2個の入力に対して、2個の出力を表示してる。
583 名前:デフォルトの名無しさん [2012/01/05(木) 00:08:20.53 ] 今までunsignedの付く変数型を使ったことが無かったので,試しに使ってみたのですが… 例えばunsigned int型なら,負の値は使用できないはずですよね? int a = 100; int b = 200; unsigned int c = a - b; とすると,cの値がマイナスになるのでエラーでも出るのかと思ったのですが… 問題なく c = -100 と出てしまいました.何故でしょうか? codepadの仕様…? codepad.org/GRuREQwD
584 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 00:10:36.33 ] >>583 c = %u
585 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 00:12:14.37 ] そりゃ "%d" って指定したら、そうなるだろうね。
586 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 00:45:29.78 ] >>581 あれ、-0だとおもってたが、、、他に特に特殊な処理は入ってないけれど
587 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 01:35:53.02 ] >>568 おそらく+0 -0の問題なんだろう if(x==0)x=0;としたら通った +0.0とするのでは対応できないということか
588 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 01:52:39.42 ] いや、別途-0を+0にするロジックを入れてるっぽい書き方だけどね。>>581
589 名前:デフォルトの名無しさん [2012/01/05(木) 08:16:34.51 ] 以下のスレの >>69 に、 hayabusa2.2ch.net/test/read.cgi/morningcoffee/1325667058/69 「マイナスになる可能性がないものは全部unsignedにしろ」というレスがあったのですが、 これの理由って何なのでしょうか。
590 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 08:37:51.07 ] >>589 面倒だからそこは読んでないけど、負の値を扱わない保証がある場合はunsignedの方が値域を広く取れる。 しかし、どの道入門レベルでは細かいことまで気が回らないだろうから signedで適切に組めるようになることを目指した方がいいかもしれない。 つまり、「マイナスになる可能性がないものは全部unsignedにしろ」と言うよりは signedかunsignedかは適材適所、I/Fをよく考えて決めるべき。
591 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 08:58:50.47 ] 大きさが足りないとかビット演算したいとかの理由がなければ常にsignedでいいよ unsignedだと小さな負の整数が大きな整数に変わっちゃうから下限チェックで問題が発生する
592 名前:デフォルトの名無しさん [2012/01/05(木) 09:10:05.79 ] ありがとうございます。
593 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:21:45.78 ] codepad.org/5x9nSXmX ↑の18行目以下の解説をどなたかお願いできませんか?
594 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:30:49.93 ] >>593 へったくっそなコードだな。
595 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:34:57.22 ] >>593 解説: なんでstrstr()使わねーの? 馬鹿じゃね? strstr()相当を作る課題なら、match_str()の中でstrlen()も使ってないのに strncmp()使っている辺りが大間抜け。
596 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:53:16.74 ] C言語今から勉強しようと思うんだけど初心者にオススメの本教えて下さい
597 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:57:44.09 ] >>596 www.amazon.co.jp/dp/4756100716
598 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:38:08.09 ] >593 ファイル開いて 一行づつ読み込んで 検索する文字列を探す。 標準文字列関数の動作の勉強かと思ったがstrncmpは使ってるんだよなぁ。
599 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 19:26:00.00 ] #include <stdio.h> #include <string.h> #include <process.h> #include <stdlib.h> int main(){ printf("%s",INPUTj3g()); return 0; } char INPUTj3g(){ char filename[30]; int strnum; printf("Input file name>");scanf("%s",&filename); strnum = strlen( filename ); if(filename[strnum-1] != 't'){ filename[strnum-4] = '.'; filename[strnum-3] = 't'; filename[strnum-2] = 'x'; filename[strnum-1] = 't'; filename[strnum] = '\0'; } return filename; } 上のような文字列を返すユーザ関数を作りたいのですがどうすればよいのでしょうか?
600 名前:デフォルトの名無しさん [2012/01/05(木) 19:30:22.16 ] どうすればよいのだおうね
601 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 19:35:05.64 ] >>599 突っ込みどころがありすぎ ここで訊くより入門書読んだほうが早いレベル
602 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 19:45:58.68 ] >>599 INPUTj3g()を抜けた時点でfilenameは使えなくなるから、呼び出す側で用意したほうがいいかな。 あとそれだと3文字以下の入力のときに、バッファの外に書き込むことになるね。 最後の文字が't'以外のときに強制的に".txt"に書き換える仕様もどうよって感じ。 #include <stdio.h> #include <string.h> #include <process.h> #include <stdlib.h> int main(){ char filename[100]; printf("%s",INPUTj3g(filename)); return 0; } char INPUTj3g(char* filename){ int strnum; printf("Input file name>");scanf("%s",filename); strnum = strlen( filename ); if(filename[strnum-1] != 't'){ filename[strnum-4] = '.'; filename[strnum-3] = 't'; filename[strnum-2] = 'x'; filename[strnum-1] = 't'; filename[strnum] = '\0'; } return filename; }
603 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 19:56:44.36 ] >>602 ありがとうございます、ではもし拡張子が入力されていなかったら プログラムで付け直させるにはどうすればよいでしょうか?
604 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:02:53.96 ] > filename[strnum-4] = '.'; > filename[strnum-3] = 't'; > filename[strnum-2] = 'x'; > filename[strnum-1] = 't'; > filename[strnum] = '\0'; strcpy(filename-4,".txt"); 遅くてもこう書き直したい。
605 名前:604 mailto:sage [2012/01/05(木) 20:07:18.24 ] >strcpy(filename-4,".txt"); 俺ってバカ… strcpy(&filename[strnum-4],".txt");
606 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:08:11.48 ] >>603 if (strchr(filename, '.') == NULL) { /* '.'がないから拡張子が入力されていない */ strcat(filename, ".txt"); /* 拡張子を追加 */ } ↑みたいな感じでいいと思う。 ファイル名をフルパスで入力されてディレクトリに'.'が含まれている場合とか には対応できない。 バッファの最大長を超える長さで入力された場合とか、まじめに作るとけっこう面倒。
607 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:17:54.08 ] >>604-607 ttp://codepad.org/ZnGnm8NK エラー 19: 移植性のないポインタ変換(関数 INPUTj3g ) まだダメみたいです・・・orz
608 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:21:42.98 ] >>607 INPUTj3g()は char INPUTj3g(char* filename)じゃなくて、 char* INPUTj3g(char* filename)だった。
609 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:25:07.59 ] >>604-607 >>608 できました、ありがとうございます!
610 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:30:03.51 ] マツコ 「K-POPはパクリ」 ikura.2ch.net/test/read.cgi/news/1325760245/ ★マツコ「韓国人でてけ!日本が嫌だったら!出てけ」 3 ikura.2ch.net/test/read.cgi/news/1325765534/ ★マツコ「韓国人でてけ!日本が嫌だったら!出てけ」 3 ikura.2ch.net/test/read.cgi/news/1325765572/ ★マツコ「韓国人でてけ!日本が嫌だったら!出てけ」 2 ikura.2ch.net/test/read.cgi/news/1325763378/ ★マツコ「韓国人でてけ!日本が嫌だったら!出てけ」 ikura.2ch.net/test/read.cgi/news/1325760720/ ↓そーす c3413260.r60.cf0.rackcdn.com/20s00002017.jpg c3413260.r60.cf0.rackcdn.com/20s00002018.jpg c3413260.r60.cf0.rackcdn.com/20s00002019.jpg c3413260.r60.cf0.rackcdn.com/20s00002020.jpg c3413260.r60.cf0.rackcdn.com/20s00002021.jpg c3413260.r60.cf0.rackcdn.com/20s00002028.jpg c3413260.r60.cf0.rackcdn.com/20s00002027.jpg c3413260.r60.cf0.rackcdn.com/20s00002023.jpg c3413260.r60.cf0.rackcdn.com/20s00002024.jpg
611 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 03:45:21.11 ] 全ての行にコメント書くとさすがにくどい?
612 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 03:51:15.19 ] >>611 意味があればいいけど。
613 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 04:39:17.13 ] >>611 よほど全編に渡ってトリッキーなやり方してるコードとか 説明のためのサンプルコードとかなら分かるが 基本的にはコメントの内容を疑ってしまうかな… どんなコメントなんだい?
614 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 08:08:08.98 ] 何故エラーが出るかわかりません。 replace = strstr(ptemp,"テスト(XXXX年XX月分)"); sprintf(monthfilename,"テスト(%c%c%c%c年%c%c月分)",monthbuf[0],monthbuf[1],monthbuf[2],monthbuf[3],monthbuf[4],monthbuf[5]); strncpy(replace,monthfilename,sizeof(monthfilename)); fputs(ptemp,fp2);←ここで書き込みアクセス違反でエラー monthfilenameには201110っていう文字が入ってる。 fp2のファイルポインタはfopenした時にNULLじゃなかったから正常なファイルポインタのはず。 どんな原因が考えられますか?
615 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 08:54:42.66 ] >>614 >monthfilenameには201110っていう文字が入ってる。 monthbufの間違いだよな? それにしたって変数名からするとmonthfilenameでfopenしそうなもんだが ”テスト(2011年10月分)”って名前のテキストファイルつくんの? もうちょっとコード出そうよ。
616 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 08:58:57.38 ] >>614 ファイルのオープンモードの間違い ポインタの指している先が無効 ここに書いてない部分が変なアドレスを書き換えている
617 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 09:03:06.00 ] >>615 monthbufの間違いです。 わかりにくかったですね。 char monthbuf[30]; char monthfilename[50]; //日付書き換え用ポインタ char *replace; //月取得 puts("指定した月をyyyymmddの形式で入力して下さい"); scanf("%s",monthbuf); sprintf(monthfilename,"%s.html",monthbuf); fp2 = fopen(monthfilename,"w"); replace = strstr(ptemp,"テスト(XXXX年XX月分)"); sprintf(monthfilename,"テスト(%c%c%c%c年%c%c月分)",monthbuf[0],monthbuf[1],monthbuf[2],monthbuf[3],monthbuf[4],monthbuf[5]); strncpy(replace,monthfilename,sizeof(monthfilename)); fputs(ptemp,fp2);←ここで書き込みアクセス違反でエラー ptempには大量の文字列が入っています。 replaceのポインタはNULLじゃないことは確認してます。 わかりにくいですが、monthfilenameはただ使いまわししてるだけです。 よろしくお願いします。
618 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 09:07:15.82 ] >>617 sizeof が問題だな 終端文字を破壊してるんだろう おかげで読んじゃいけない部分を読んだ
619 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 09:16:39.45 ] >>618 ありがとうございます sizeofって終端文字を破壊するんですか? よく意味がわからないんですがどうやって解決すればいいですか? strlenにしてもだめでした。 とりあえずやりたいのは、 ptempの中にある「テスト(XXXX年XX月分)」という文字列を ちゃんと数字の入ったものに置き換えたいんです。
620 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 10:01:35.06 ] >>619 「sizeofが終端記号を破壊する」のではない。 sizeof(monthfilename)で50が得られるが、本当にreplaceしたいのは”テスト(XXXX年XX月分)” の部分だから、50ではなく”テスト(XXXX年XX月分)”の長さが必要。 X sprintf(monthfilename, "テスト(%c%c%c%c年%c%c月分)", O sprintf(monthfilename, "テスト(%c%c%c%c年%c%c月分)¥n", /* <-strlenで長さを得られるようになる */ X strncpy(replace, monthfilename, sizeof(monthfilename)); O strncpy(replace, monthfilename, strlen(monthfilename));
621 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 10:16:42.62 ] まだエラー出るじゃねーかw もう一回自分で調べてみるわ
622 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 10:45:30.61 ] *ptemp = "....."とかやってんじゃねーの?
623 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:23:51.71 ] >>619 strncpy()の挙動はちゃんと調べた? 曖昧にしていると嵌るぞ。 monthfilenameに文字列を作ったら、memcpy(replace, monthfilename, strlen(monthfilename))でいいべさ。
624 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:29:38.54 ] そもそも、replaceが見つかった時点で const int year = sizeof("テスト(") - 1; const int month = sizeof("テスト(XXXX年") - 1; replace[year] = monthbuf[0]; replace[year + 1] = monthbuf[1]; replace[year + 2] = monthbuf[2]; replace[year + 3] = monthbuf[3]; あ、面倒だ。以下同様に。或いはmemcpy()を使って。 memcpy(replace + month, monthbuf + 4, 2); ってこったろ。 monthfilenameなんて要らないじゃん。
625 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:30:29.67 ] >>620 > O sprintf(monthfilename, "テスト(%c%c%c%c年%c%c月分)¥n", /* <-strlenで長さを得られるようになる */ えっ
626 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:40:53.45 ] >>624 後でメンテが面倒だからその方法はあえて避けた で、memcpyの関数を見て、「あれ?俺何でstrncpy使ってんだ?」と思ったんで、 memcpy(replace,monthfilename,strlen(monthfilename)); って書いてみたら一発でいけました strncpyは最後に終端文字が自動的に付加されないことは知ってたから、 使ったのに何でダメだったんだろう? あくまで文字列コピー用の関数だからかな? まあとりあえずmemcpyでいけましたんで良しとします。 ご迷惑をおかけしました。 ありがとうございました。
627 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:44:25.52 ] 確かに>620は間が抜けている。 >>604 strcpy()は遅くないよ。
628 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:52:13.36 ] >>626 sizeof使ってたからじゃなくてか?
629 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:17:00.56 ] >>628 sizeofをstrlenにしても、strncpyを使ったらだめでした 原因分かる人が居るなら教えて欲しいものですね
630 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:20:55.01 ] fputs で落ちてるんじゃなくて strncpy の内部で落ちてるんでないかい? replace の器が 丁度 ,"テスト(XXXX年XX月分)" で終るような場合 sizeof(monthfilename) = 50 で複写すると器の範囲を突破するもの
631 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:27:02.05 ] エスパー試験か。
632 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:31:48.07 ] >>630 残念 replaceの器であるptempで該当の文字がある部分は、終端よりも大分前だ。 たぶん終端よりも2000バイトぐらい前。 わかる人いない? このスレならレベル高そうだから誰かわかると思ったんだけど。 いや、別にバカにしてないよ
633 名前: ◆QZaw55cn4c mailto:sage [2012/01/06(金) 12:37:10.20 ] つ codepad.org/ 話はそれからだ。
634 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:37:53.90 ] >>632 コードを全部あげてみなよ。
635 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:42:10.40 ] ptempの文章はあるテキストファイルから読み込んでるから無理 他のコードはvector使いまくってて絶対読めないよ あと身バレしそうだし。 再現できるコード作ってみるわ。余裕があれば。
636 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:47:50.21 ] >>635 釣だろうけど手空きだったので。 codepad.org/QjXEQX0c replace = strstr(ptemp, "テスト(XXXX年XX月分)"); で結果NULLの対策サボってるためとエスパーしてみた。
637 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 12:56:15.99 ] >>636 実行したら最後に数字の8が書き出されたぞ あとなんで改行文字入れてるのか理解できん。必要か? 結果NULLについては事前に調べて問題なかったから、 あえて書いてないだけ。
638 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:00:48.51 ] 配列のサイズが実は50ではない、ファイル名のプレフィクスが実はテストではない strncpyしたあとの文字列を標準出力に出してみるとかデバッガで見てみるとかしたらどう
639 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:01:52.78 ] ああでもmemcpyならうまくいったのか。 wchar関係とかは
640 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:03:28.82 ] >>637 再現コードを作ってからにしろ、低脳が。
641 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:08:30.36 ] ていうか、replaceの位置自体、ptempの終端から2000バイト以上も前の位置なんだから、 そこにもし50バイト書き込んでもちょっと上書きされる部分が増えるだけで、 別に不正な領域に書き出してるわけじゃないじゃん? もしおかしい領域に書き込んでたら、strncpyの時点でエラーが出るはずだしね。 fputsでエラーが出る理由がわからん。 0x0000000へのアクセス違反っぽいエラーだけど。 なぜmemcpyに変えるだけで、fputsでエラーが出なくなるのかが意味不明。 別に書き換えてる領域は変わんないんだし。 面倒になってきたからゆるーく考えるか、スルーして下さい。 再現コードも作る時間ないかもしれんから
642 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:09:33.30 ] 分かったよ 再現コードは必ず作るから一日ぐらい待っててくれ。
643 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:10:33.20 ] >>641 実はC++/CLIでpin_ptr使ってないからってこともないんだよね。
644 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:12:05.31 ] 糞CLIなんか使わないよ
645 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:12:28.81 ] vectorの内部を直接触ってるとか
646 名前:614 mailto:sage [2012/01/06(金) 13:13:58.28 ] ptempはただの動的確保したバッファだし、 書き出し部分ではvector関連は一切触ってない
647 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:14:02.61 ] どっかで文字列終端コードを破壊しちゃってるような感じのコケ方だなあ
648 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:37:29.65 ] 再現しないコード codepad.org/VLVofCEN
649 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 15:16:16.30 ] もしLinuxで書いてるなら、614はvalgrind とかの使い方を覚えるべき。
650 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 15:19:38.96 ] なんでvgrind?と思ったがそんなのがあるのか。
651 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 15:40:50.89 ] strlenは無条件にバイト数を返して、strncpyの引数3は文字数な環境だとか。
652 名前:614 mailto:sage [2012/01/06(金) 15:50:59.85 ] すいません strncpyでもいけました。 ですが、monthfilenameのバッファを適当な別のバッファに変えて、 sprintf(tempbuf,"テスト(%c%c%c%c年%c%c月分)",monthbuf[0],monthbuf[1],monthbuf[2],monthbuf[3],monthbuf[4],monthbuf[5]); strncpy(replace,tempbuf,sizeof(tempbuf)); ってしないとだめでした。 monthfilenameを使うとやっぱりエラーが出ます。 まあmonthfilenameっていう使わなくなったバッファを使いまわした罰だと思いますが、 sprintf実行した時点でちゃんと終端文字が付加されるので、 おかしくなるはずはないと思うんですが何でですかねぇ。
653 名前:614 mailto:sage [2012/01/06(金) 15:55:40.77 ] それとLinux使ってないってかさっぱりわからないです。 ありがとうございました。
654 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 15:56:45.68 ] で、再現コードは。 どこまで低脳なんだ。
655 名前:614 mailto:sage [2012/01/06(金) 15:59:49.90 ] 再現コードは作れませんでした 今は元コード使って実験してます。 だって再現しないんだもん
656 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 16:11:27.36 ] fopen に渡したファイル名のポインタを暗に保持してて、書き換え不可な処理系とかのオチだったりして char name[] = "hogehoge"; FILE* fp = fopen(name, "w"); strcpy(name, "a"); fputs("tekitou", fp); これだけで沈
657 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 16:17:46.01 ] まったく、どっからそんな妄想がわいてくるんだよ…
658 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 16:35:50.94 ] つか最初から処理系を書けよ。
659 名前:614 mailto:sage [2012/01/06(金) 16:44:44.43 ] VC2008 express editionとwin 7のコンビです
660 名前:614 mailto:sage [2012/01/06(金) 16:46:02.01 ] >>656 あ、これかもしれないです。 ちょっと待ってて下さい。
661 名前:614 mailto:sage [2012/01/06(金) 16:49:32.60 ] あーでも再現コードでやってみても再現しないですね。 元コードでは相変わらずエラー。 何が違うんですかこれ
662 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 16:55:53.28 ] すでに他のところでヒープかスタックがぶっこわれてるに10ジンバブエドル
663 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 17:03:26.64 ] >>614 フィルターを通すと出てくる情報がすべてゴミになるなw 身バレ云々バカじゃね
664 名前:614 mailto:sage [2012/01/06(金) 17:04:02.24 ] でも原因は明らかに>>656 ですよね ファイル名として使ったバッファは使いまわさないようにします。 ありがとうございました。
665 名前:614 mailto:sage [2012/01/06(金) 17:04:52.46 ] バカというかマヌケですね ありがとうございました
666 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 17:08:46.22 ] >>656 で落ちる処理系なんてどんな行儀の悪いコンパイラだよ そのゴミみたいなコンパイラの名前を知りたいもんだ
667 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 17:23:28.39 ] いや、馬鹿だよお前 プログラムやめるべき
668 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 17:31:23.37 ] >>665 落ちるコードの全体ってどこにあります? 未解決なら見てみたいんだが。
669 名前:614 mailto:sage [2012/01/06(金) 17:34:37.76 ] >>666 >>659 に書いてますが >>667 自分用のプログラムだから手抜いて作ったんだよ 配布するやつはちゃんと作ってるから安心しろ >>668 全体のコードは>>614 の50倍ぐらいの長さもあるから無理 身バレの可能性あるし
670 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 17:52:40.25 ] >>656 が原因とも確認してねーんだろ? だいたい、年を書くのに%c%c%c%cとか使うとこから程度は知れてるがな。
671 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:01:28.93 ] >>670 いや、だから再現するために>>656 のコードと同じことしてみたけど再現しなかったんだって >>661 で言ってるよ 元コードだと起こって、再現するために書いたコードでは起こらなかった コード量による違いでもあるのか?
672 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:02:46.49 ] >>670 別に普通だろ。 それに自分用のプログラムだから動けばいい程度でしか作ってないし
673 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:05:55.10 ] >>672 これが処理できるか確認してもらえますか? int main(void){ char buf[] = "aaa"; buf[1] = 'b'; puts(buf); }
674 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:07:33.29 ] >>673 できた aba
675 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:07:43.12 ] >>672 じゃぁ>>664 は何なんだよ。 頭腐ってるだろ、お前。 >>673 それに何の意味があるんだ。
676 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:08:04.43 ] >>674 ごめん。
677 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:11:00.13 ] >>675 >>664 はそれ以外原因が思いつかないからそう書いたんだよ 一番筋が通ってるし、なんか聞いたことある気がしたしな
678 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:18:07.50 ] なんだその理由は。 これがゆとりが進化した形なのか。
679 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:19:09.05 ] 少なくともお前よりはゆとりでない自信はある
680 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:24:00.19 ] じゃぁなんで>>662 の指摘は無視なんだ? デバッガ使ったことあるか?
681 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:26:13.91 ] デバッグなんてとっくの昔にやってるわ それでもわからんからここに来たんだろーが
682 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:29:34.15 ] ゆとり乙。
683 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:30:51.12 ] >>682 はいはい クソガキは寝てろ
684 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:42:33.72 ] デバッガの使い方も知らないでよく言うな、まったく。
685 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:48:51.15 ] 今回のはデバッガを使っても分からない問題だろ だからここに来た それだけ
686 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:53:10.35 ] なんのためのデバッガだよ。 printfだけでもわかるだろ。
687 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:54:55.88 ] わかんねーよ printfするまでもなく、ブレークポイントしかけて変数の中身見てるわ それでもわかんなかったんだよ
688 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:55:47.73 ] それはお前が低脳なだけ。 再現コードも出さずに迷惑なだけ。
689 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:55:53.74 ] 先に俺の実力とどんなデバッグをしたか書いとけばよかったな 個別に黙らせてると疲れるわ
690 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:56:50.13 ] 再現コードがかけないんだから仕方ないだろ まだはっきりと原因特定できてないんだから めんどくせーからまた後でくるわ
691 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 18:58:11.07 ] いやいや、すごいよ、お前は。 落ちる場所までわかってるのに理由がわからないとか。 しかもデバッガ上で再現してんだろ? ほんと、すごいわ。
692 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:04:31.37 ] 元コードのデバッガ上で再現してるよ 変数見てもおかしくないんだから原因わかるわけねーだろ
693 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:07:03.13 ] >>692 問題のソースは>>636 のやつか?
694 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:16:44.35 ] つか最初からmonthfilename使い回そうとかバカ確定なんだからさ
695 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:17:11.92 ] しかし、よくそんなレベルでこんなこと>>689 言えるね、おれもびっくりするよ。
696 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:20:46.07 ] >>693 問題のソースは>>617 です。 ですが>>652 のように、monthfilenameを使わずに、 別のバッファを使えば問題なく処理できました。 それともう一回検証してみたところ、memcpyでもstrncpyでも>>617 のソースでやればエラーがでました。 「memcpyならいけた」という私の発言は間違いです。失礼しました。 >>617 のソースは全体のソースの一部です。 再現しようと>>617 のソースを切り取って、 適当な文字列を作ってptempに代入してやってみたら、何故かエラーが出ませんでした。 ですので原因がはっきりと特定できていない状況です。 でも状況からして>>656 の方が指摘していただいてることが 一番可能性が高いと個人的には思っています。 そろそろウザイと思われてると思いますので、 スルーしてくださって結構です。
697 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:22:13.73 ] >>694 お前は人のレス読んでるのか? 自分用のプログラムだから手抜いて作ってるって言っただろが めんどくせーから使いまわすか、って気持ちで作ってたんだよ だからそんなとこ突っ込んでも意味ねーよ
698 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:22:43.71 ] はいはい、低脳乙。
699 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:23:45.56 ] マジメにレスしてくれた方はありがとうございました。 その他のクズの皆さんは死んでください 以上。
700 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:25:13.29 ] 迷惑かけるだけかけて、ほんとゆとりな上にクズが何言ってるんだか。
701 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:30:40.02 ] >>696 妙なところを書き換えてない限り >>656 で落ちるのはありえないんだよマヌケ
702 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:32:32.06 ] >>701 再現コードでは落ちなかったんだよ 元コードだと落ちるんだよ 俺も原因わからねーよ
703 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:35:02.17 ] で、まだ>>689 なの?
704 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:44:33.81 ] >>699 win7でvc++2008で試してみたが。。。 表記されていないptempを「テスト(XXXX年XX月分)」にして、 strncpyの第三引数をstrlen(monthfilename)にすると普通に動いた。
705 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 19:50:20.27 ] こんな聞きかたしてるバカは死ねってことか。了解。
706 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:17:17.89 ] 早く>>689 頼むよ。 どんだけすごいのか教えてちょ。
707 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:52:48.43 ] >>689 当たり前だろ。 質問するときは、どういうことを調べたかとか試したかとか書けよ。 プログラムの技術以前の問題だ。
708 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:05:14.27 ] どこがおかしいか特定できないのに、ここがおかしいはずだって思い込むアホが多すぎて困る
709 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:11:25.65 ] 思い切りから不具合を見つけることもあるんだが。 こいつCの仕様を丸暗記してるのか?
710 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:15:55.85 ] 思い切り? こいつってどいつのことだ。 普通、わからなかったら仕様書確認するだろ。