[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 15:17 / Filesize : 213 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131



1 名前:デフォルトの名無しさん [2007/02/01(木) 23:08:46 ]
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
pc10.2ch.net/test/read.cgi/tech/1159613789/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.34【環境依存OK】
pc10.2ch.net/test/read.cgi/tech/1169039760/
C/C++の宿題を片付けます 82代目
pc10.2ch.net/test/read.cgi/tech/1169575464/

605 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:23:37 ]
>>603
最終セクタの0x1Aまでがファイルの「サイズ」だろ?

606 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:45:36 ]
でもそれは管理されてない。

607 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:54:38 ]
ん、「管理されているかどうか」という話なの?
「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの?

だったらそれでいいけど。

608 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:57:38 ]
あっと、
「ファイルのサイズとはOSに管理されていなければならない」という
話の流れとは関係ないことを言いたかっただけで
「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。

609 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 10:25:40 ]
バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。

610 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 03:19:11 ]
ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、
テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。
統一した「ファイルサイズを得る方法」なんてあるわけがない。

あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。


611 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 03:23:51 ]
ファイルサイズを取得する関数が標準で用意されなかったのは、
そのあたりが理由なのかな?

612 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:03:56 ]
>>611
そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし
ファイル操作もストリーム処理系を除くとremove()位しかない。

613 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:31:09 ]
MS-DOS 1.0 もディレクトリないんだっけ?



614 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:43:31 ]
汎用機もねーよ

615 名前:デフォルトの名無しさん [2007/06/24(日) 22:22:42 ]
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

616 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:24:17 ]
そのネタ飽きた

617 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 10:05:04 ]
そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな
128バイトのブロック単位だったからファイルの後ろにはゴミがついていた
Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・

618 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 10:55:57 ]
マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。

619 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 11:58:13 ]
リソースフォークの話は出してくるやつが出ると思った
リソース/データフォークのサイズもファイルサイズの指定の意味で
書いたんだがわからなかったんだろう


620 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:09:30 ]
>リソース/データフォークのサイズもファイルサイズの指定の意味で
>書いたんだがわからなかったんだろう
これ日本語なの?

621 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 19:06:14 ]
まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。

622 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 19:07:17 ]
どうと思う!
いや、どうかと思う、だorz

623 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:39:59 ]
MFCでCString型の変数strにメタ文字の.が入っている場合\記号と連結するのに
str = "\\" + str;
これで全然問題ないのですが、標準のCで
char str[MAX_PATH];
strcpy(str, ".");
starcat("\\", str);
こうするとアクセスバイオレーションが発生します
どうしたらええの?
strcpy(str, "\.");これでも駄目だった
そうそう環境はWinXPSP-2、VC6です




624 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:41:45 ]
>>623
starcat なる謎の関数の仕様をよーく確認しろ。

625 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:42:52 ]
星猫

626 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:46:52 ]
スマンstrcatだったMSDN見ても問題ないと思うのだが?
文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが

627 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:00 ]
>>626
じゃぁ strcat の仕様をよーく確認しやがれこのバ

628 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:55 ]
そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。

629 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:50:02 ]
それでもstarcatならきっとやってくれるさ

630 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:50:05 ]
MFC 使える環境なら CString か std::string 使えば?
そっちの方が幸せになれるよ。セキュリティ的にも。

631 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:52 ]
>>628
ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww
>>630
だからMFCなら全然無問題なのだが、Cの事も知りたいからよ

632 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:54 ]
>>626
strcatでは、後ろに追加することしか出来ないんだ。
"//"には、後ろにstrを追加する余裕なんて無い。

633 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:59:06 ]
>>631
ならリテラル以外で問題が再現するコードを書いてみやがれ



634 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:00:41 ]
>>631
C は面倒臭いよ。
バッファオーバーフローをいちいち気にしないといけないから。

635 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:04:06 ]
sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。
しかし、やりたいことがよく判らないからサンプルを書けない。
例えばディレクトリとファイル名を連結したいだけならこうなるのだが。
sprintf(path, "%s\\%s", dir, file)

636 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:08:05 ]
>>631
どうせ初期化してないのに strcat とかしたんじゃないのか?

637 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:12:33 ]
元のCStringを使ったコードはこうなっていると解釈するぞ。
CString str = ".";
str = "\\" + str;

char str[MAX_PATH] = ".";
size_t size = strlen(str) + 1;
if (size >= MAX_PATH)
  abort(); /*好きにしてくれ*/
memmove(str + 1, str, strlen(str) + 1);
str[0] = '\\';
WindowsならTCHAR系使えという気もするが、とりあえずcharにしておいた。


638 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:39:04 ]
BoehmGCのようなライブラリを使えば
char *str = ".", *tmp;
tmp = GC_MALLOC(strlen(str) + strlen("\\") + 1);
sprintf(tmp, "\\%s", str);
str = tmp;
でいいよ

んでも毎回strlen()とかすんのはウザいので、
typedef struct string_t { char *s; size_t len; } string_t;
とかして、string_tに対する操作を関数で一通り作るといいよ

んでもそんなアホくさい作業をするくらいならC++で素直に
std::basic_string<>使ったほうがいいよ

639 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:53:40 ]
MFC使っているならCStringもありさ

640 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:19:12 ]
strcpy -> strncpy
strcat -> strncat
sprintf -> snprintf

641 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:09:50 ]
>>640
残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。

642 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:07:18 ]
結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。
何より楽だし。

643 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:28:15 ]
バッファオーバーフロー脆弱性の話を聞くたびに、
敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。
それができないなら C++ にしる、と。



644 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:19:51 ]
>641
C99は未だ存在しないのか・・・

645 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:22:59 ]
C99 が使える環境では snprintf を使って、
使えない環境なら等価な関数に #define すればいいんじゃない?

646 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:26:40 ]
snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?

647 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:33:00 ]
VC++ には _snprintf がある。

648 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:13:07 ]
char *s;
FILE *fp = fopen("/dev/null", "w");
size_t len = fprintf(fp, ...); /* 長さを数えてもらう */
fclose(fp);
s = malloc(len + 1);
sprintf(s, ...);

勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが
それぐらいならやっぱりC++を使うべきという結論に

649 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:38:37 ]
>>648
必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。
C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。

650 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:37 ]
>>649
そいつらの代替実装の話だろ。

651 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:40 ]
問題は移植性の低さだな
標準とはいえC99未対応のCコンパイラは多い

652 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:00:52 ]
snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?

653 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:09:55 ]
>>652
あってもC99と同じ仕様とは限らん
たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか



654 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 03:06:17 ]
その場合は自分でラッパ関数を定義すればいいんじゃないかな?

655 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:29:01 ]
*BSD LIBCあたりから掻っ払って来りゃええやん。

656 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:59:02 ]
ねぇねぇおまえらちょっと教えてくんない
ファイルの行数を取得する標準関数なんてないよね
そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数
数えるとかやってんの?
どうよ


657 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:03:13 ]
そうする

658 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:34:14 ]
それ以外の方法があるなら是非とも教えてもらいたいもんだ

659 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:50:13 ]
fp = fopen(filePath,"r");
while(fgets(szBuff, MAX_PATH, fp) != NULL)
{
  maxLine++;
}
fclose(fp);

char szItem[7][maxLine++];

じゃぁこれはどうよ、二次元配列が作りたくてこうやったら
error C2057: 定数式が必要です、MSDNとか調べてsupport.microsoft.com/kb/142493/ja

char szItem[7][((const int)maxLine++];
こうしてもなおんないんだよねぇこれってどうよ

660 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:52:13 ]
スマン訂正
int maxLine;
罰char szItem[7][((const int)maxLine++];
丸char szItem[7][(const int)maxLine++];

661 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:59:58 ]
C99じゃない限り配列の大きさはコンパイル時に固定=定数

662 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:07:53 ]
あきらめきれなくて
回避策はないのかと聞いてみる

663 名前:デフォルトの名無しさん [2007/07/05(木) 00:09:15 ]
ttp://www23.atwiki.jp/homework/pages/11.html#id_062fdb0f
のwikiに載っていたリサージュのプログラムで
x = cos(2 * PI * a * t);
y = sin(2 * PI * b * t);
の2の値を自由に変えられる(自分で入力できる)ように
したいんですけど、どうやったらいいですか?




664 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:10:28 ]
>>662
malloc使えばいいんじゃない

665 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:12:44 ]
>>664
クワシク

666 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:17:10 ]
そこらへんの入門書に書いてある。
残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。

667 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:53:10 ]
>>662
寧ろ、C++でstd::vector使えばいいんじゃない?

668 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:32:50 ]
ドウシテC99ヲツカワナイノデスカ

669 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:48:51 ]
ドウシテC99ガフキュウシテルトオモウノデスカ

670 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:50:55 ]
C99 使うくらいなら C++ 使う

671 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:52:17 ]
んだな

672 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:13:16 ]
単項演算子の+って、どう言ったときに役に立つのでしょうか?
Cだけの話ではないかもしれませんが。

673 名前:デフォルトの名無しさん mailto:age [2007/07/05(木) 23:13:35 ]
メジャーなコンパイラでC99に対応してないのってあるの?
俺趣味グラマでgccしか使わんからわからん。



674 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:16:17 ]
>>673
VC++

675 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:20:05 ]
>>672
桁合わせくらいには役に立つことはあるかも。

676 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:47:34 ]
>>672
-があるから+も装備したらしい

677 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:45:33 ]
昔、
#ifdef xx
# define SYM 10
#else
# define SYM
#endif
のような時に

int num = SYM +0;
というような使い方をした覚えがあるような無いような。

678 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:20:07 ]
マクロ関連で役に立つことがたまにありそうではあるな。

679 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:35:03 ]
正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?

680 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:36:20 ]
単項+のオペランドも式だし、
単項+のオペランドになれない式もあるだろ。

681 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 03:44:31 ]
#ifdef xx
# define SYM 10
#else
# define SYM 0
#endif
では、何故ダメだったのか教えてほしい。

682 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:11:51 ]
学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。
○×ゲームを作るプログラムを作っていたんですが。
1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。
line1[10]=" 789\n",
line2[10]=" 456\n",
line3[10]=" 123\n",
という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが
何故Tabキー使っては駄目なのか教えていただけませんか?

683 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:17:17 ]
>>682
書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな



684 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:37:32 ]
いやコンパイルエラーになるんだろ。
たぶん、構文的に駄目になっているのだろうとしか言えない。
後できちんと規格書に当たってみる。

とりあえず、文字列リテラルの中でタブ文字を表現したければ、
タブを直接入力する代わりに\tを使えばいいと言っておく。

685 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:44:18 ]
>>683
ほんとにCはかじったばっかりなんでよく分からない上に
今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`)
"と7のスペースね。

strlenって言ったら文字列の長さだよね?
Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?

686 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:48:07 ]
>>685
やってみたほうがよく分かる

687 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:05:02 ]
>>684
指導書に基づいてプログラム作ってるんだ。
基本的に書き換え不可だからそういうことはできないんだ
>>686
ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)

688 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:12:54 ]
環境もないのに実習なんて言うのか?

689 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:28:53 ]
>>688
ヒント:やるのは学校今は家にいる
学校のPCは勝手に使っちゃいけないんだ。

690 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:30:22 ]
じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。

691 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:32:15 ]
>>689
今書き込みをしているのが自分の自由に使えるPCからなら、
開発環境をインストールすることを勧める

692 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:36:48 ]
>>691
今やってみたがページが真っ白のまま止まってしまう。
ダメみたいだ/(^o^)\

693 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:38:11 ]
とりあえずお前はCの勉強する前にPCの勉強をしろ。



694 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:40:29 ]
>>692
Windows Vista と予想

695 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:49:11 ]
やっぱり聞くんじゃなかったかな。
もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。

696 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:54:59 ]
そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。

697 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:59:16 ]
寿司食いたい

698 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:13:41 ]
基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?

699 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 10:29:56 ]
スペースをタブにできるなら、スペースを\tにもできるだろう

700 名前:デフォルトの名無しさん [2007/07/12(木) 10:53:19 ]
ファイルがテキストファイルかバイナリーファイルかを
Cプログラムで判定したいのだけれど、方法を教えてくれ。


701 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:01:37 ]
>>700
ファイルの内容を1バイトずつ全て調べて、テキストファイルに通常含まれない
コードが含まれているかどうかをチェックするしかない。
ただし fopen() でバイナリモードで開くのを忘れずに。

702 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:23:16 ]
つ[/usr/bin/file]

703 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 11:33:10 ]
文字データって言ってもいくつかの体系を考慮したら・・・ヘッダとか考えてみたけど
それも当てにならんか・・・っつーことで、ちゃんと拡張子を付けい。



704 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 12:26:31 ]
>>702
ここをどこだと思ってるんだ

705 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 12:27:18 ]
そもそもテキストファイルとは何なのか。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<213KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef