- 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/
- 945 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 09:13:16 ]
- 特定の範囲の整数(例えば1〜10000)だけを入力させたいのですが、
fgets()使用時に桁溢れを完全に抑止することは可能ですか? char *buf[10]; unsigned int value; while(1) { fgets(buf, 10, stdin); 〜isdigit()とかで数値のみかを判定して、atoi()でvalueに格納してbreak〜 } fprintf(stdout, "%u\n", value); こんな感じで書いてるんですが、わざと入力を10桁以上にしたときに入力バッファに残ってしまってうまくいきません。 何かイイ方法あるでしょうか?(fflush(stdin)は無しで)
- 946 名前:945 mailto:sage [2007/09/13(木) 09:14:22 ]
- >>945
× char *buf[10] ○ char buf[10] orz
- 947 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 09:19:36 ]
- >>945
fgets の後で fscanf(stdin,"%*[0-9]");
- 948 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:18:05 ]
- >>947
通常の入力をした場合(桁数が少ない場合)に入力待ちにならない?
- 949 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:22:42 ]
- fflush(stdin)と置換可能な関数を自作するのは厳しい
とはいえ、fflush(stdin)は未定義 面倒くさいけど、fgetsで読み込んだbufに'\n'が有るかチェックして、 '\n'が無いなら'\n'が出てくるまで読み捨てることになる #include <stdio.h> #include <string.h> int main(void) { char buf[10]; char *p; int c; while (fgets(buf, sizeof buf, stdin) != NULL) { if ((p = strchr(buf, '\n')) != NULL) { *p = '\0'; } else { while ((c = fgetc(stdin)) != '\n' && c != EOF) {} } puts(buf); } return 0; }
- 950 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 12:33:40 ]
- もっといい方法あるのかもしれないけど、こんなんでどうかな
int get_unsigned(unsigned *v) { char buf[16]; char *p; int c; if (fgets(buf, sizeof buf, stdin) == NULL) return EOF; if (strchr(buf, '\n') == NULL) while ((c = fgetc(stdin)) != '\n' && c != EOF) {} *v = strtoul(buf, &p, 10); return *p; } int main(void) { unsigned val; int end; while (printf(">>"), (end = get_unsigned(&val)) != EOF) { if (end == '\0' || isdigit(end)) printf("W:入力が切り捨てられました.\n"); else if (end != '\n') printf("W:不正文字がありました. '%c'\n", end); if (val < 1 || 10000 < val) printf("W:入力範囲外です.\n"); printf("<<%u\n", val); } return 0; }
- 951 名前:945 mailto:sage [2007/09/13(木) 13:55:57 ]
- >>947-950
ありがとうございます。おかげさまで解決しました。
- 952 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 14:16:48 ]
- scanf("%*[^\n]%*c");なんてできなかったっけ?
- 953 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 14:20:57 ]
- >>952
それだと、次の文字が\nだと[^\n]にマッチしないので、その時点でひっかかり 読み捨てることが出来ない。 scanf("%*[^\n]"); scanf("%*c"); ならおk
- 954 名前:デフォルトの名無しさん [2007/09/15(土) 02:24:20 ]
- うーん勉強になるなあ。ここに書き込みしている人達て通算何年くらい勉強してきたんですか。
俺には凄過ぎっすよ。
- 955 名前:デフォルトの名無しさん [2007/09/15(土) 02:26:09 ]
- 名プログラマになる為に猛勉強だぜ。
- 956 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 09:32:53 ]
- ここは知ったかばっかり
- 957 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:28:45 ]
- 知ったかな〜知ったかな〜うにゃうにゃ
はれってほれってひれんら〜
- 958 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 18:37:19 ]
- >>957 迂闊にも笑ってしまいますた
- 959 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 17:05:01 ]
- SHRT_MIN >= INT_MIN && SHRT_MAX <= INT_MAX 常に成り立つと思うのですが
sizeof(short) <= sizeof(int) は処理系に関係なく成り立ちますか?
- 960 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 17:07:56 ]
- はい。
- 961 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 18:26:29 ]
- ANSI C99準拠の標準ライブラリについて、詳しく説明しているサイトありませんか?
素直に本買ったほうがいいでしょうか?
- 962 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 18:35:59 ]
- っ[JIS X 3010]
- 963 名前:961 mailto:sage [2007/09/18(火) 19:21:05 ]
- >>962
ありがとう。でも高いねコレ…素直に本買います。
- 964 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 20:47:24 ]
- つ[ttp://www.jisc.go.jp]
- 965 名前:デフォルトの名無しさん [2007/09/19(水) 15:50:54 ]
- 設計(PAD)でファイルを開いて読み込んでファイルの情報を構造体に格納するのって
どうやるか教えていただけませんか?
- 966 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 16:06:49 ]
- たぶんCの話じゃないと思うぞ
- 967 名前:デフォルトの名無しさん [2007/09/19(水) 17:28:22 ]
- 今C言語の勉強をしていて、ファイルの情報を構造体に格納して
それをメモリに展開するってゆーのをやってまして
- 968 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:30:39 ]
- fread
- 969 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:32:23 ]
- そんなもんファイルにどういう形式でデータが記録されていて
格納する構造体はどんなものかによるとしか言えん
- 970 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:34:00 ]
- PADは関係あるのか?
- 971 名前:デフォルトの名無しさん [2007/09/19(水) 17:34:18 ]
- JIS X 3010-1993 を読むと
3.4 バイト 実行環境の基本文字集合の任意の要素を保持するために十分な大きさを持つデータ記憶域の単位。 1 バイト中のビット数は,処理系定義とする。 5.2.4.2.1 CHAR_BIT ビットフィールドでない最小オブジェクト(バイト)におけるビット数 6.3.3.4 sizeof演算子の結果は,そのオペランドの(バイト数での)大きさとする。 sizeof(char) == 1 となっているのですが,ここから char 型オブジェクトのデータ記憶域での大きさは 1 バイトで 1 バイトは CHAR_BIT ビットと判断できるでしょうか?
- 972 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:36:24 ]
- マジっすか。バイト=8bitだと信じてました。
int型が、その処理系で一番速く処理できるビット幅、というのは聞いたことありますが・・・
- 973 名前:967 [2007/09/19(水) 17:58:00 ]
- 今PADの最中なんです。
問題としてはファイルにある社員IDと氏名を構造体に格納し、 メモリに展開するというものです
- 974 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:06:04 ]
- C言語の規格改定って今でも進められているんでしょうか?
- 975 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:47:35 ]
- >>971
そう思って構わないはず。 >>973 常に8ビットを表す単位が必要なら、オクテットを使う。
- 976 名前:967 [2007/09/19(水) 19:03:57 ]
- 文字の長さが2-10で変化するってどゆ意味ですか?
そもそも文字の長さってなんですか?
- 977 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:09:43 ]
- 次スレテンプレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132 このスレは標準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 131 pc11.2ch.net/test/read.cgi/tech/1170338926/ GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は 専門の別スレッド↓があるのでそこへさようなら。 【初心者歓迎】C/C++室 Ver.42【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1188748806/ C/C++の宿題を片付けます 95代目 pc11.2ch.net/test/read.cgi/tech/1187944110/
- 978 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:15:34 ]
- GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
↓ GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は 何か気になるから変えてくれたら嬉しい
- 979 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:58:51 ]
- >>937
お前前も来たな 帰れ いや 死ね
- 980 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:59:21 ]
- >>973だった
- 981 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:22:18 ]
- (char *)*char_list->c
という式が表す値は (char *)型のポインタcが指しているデータ (char *)型のデータ のどっちなんでしょうか?
- 982 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:37:54 ]
- 演算子の優先順位から、(char *)(*(char_list->c))
- 983 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:47:49 ]
- >>982
その式を見るとカッコ(キャスト)よりも*演算子のほうが優先されている みたいなんですが、(1+2)*(3*3)のようなカッコとキャストとしてのカッコは 別物として扱われているんでしょうか?
- 984 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:52:45 ]
- そりゃ意味からして別物だろうが
- 985 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:56:27 ]
- ついでに言うと、関数呼出演算子の括弧も別物。
- 986 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:04:19 ]
- >>985
全部一緒くたにして考えてました。orz 最後にもう一つ、 char c = 'a'; char *pc = &c printf("%d\n", (int)*pc); 予想では上のコードは4バイト分の整数を出力すると思ったのに、 実際にやってみたらa一つ分の97しか出力しませんでした。 これは何故なんでしょうか?
- 987 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:06:35 ]
- 何を言ってるんだ、お前は
- 988 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:07:45 ]
- *(int*)pc とでもやりたかったのか?
- 989 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:09:33 ]
- >>986
何が言いたいか分からん。 97は2桁だろ。何が出て欲しいんだか。
- 990 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:11:57 ]
- >>986
charだろうがintだろうが10進数で出力したら97だろ
- 991 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:13:08 ]
- >>986
>4バイト分の整数 この部分を具体例をあげつつ詳細に説明してくれ
- 992 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:15:21 ]
- char c = 'a';
char *pc = &c; printf("%d\n", sizeof((int)*pc)); 4バイト(intの大きさ)分の整数が出力されているってのはあってるぞ
- 993 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:16:26 ]
- >>986
これでどうだ。 printf("%.8X\n", (unsigned int)(unsigned char)*pc); ここにunsigned intへのキャスト演算子は不要だがサービスしておいた。
- 994 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:21:24 ]
- >>973
PADって構造化フローチャートみたいなやつ?
- 995 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:24:57 ]
- >>994
大学でやった記憶が
- 996 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 02:05:03 ]
- 99というのはISOの年度だからANSI C99というのはおかしくないか
- 997 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 02:12:12 ]
- おかしいね。
ANSI C89 ISO C90 ISO C95(と言っていいのか) ISO C99
- 998 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 08:33:04 ]
- 個人的にはC89とかC99の前にANSIとかISOとか付いてる時点でキモい。
まぁキモいだけで、だからどうしようってほどじゃないけど。
- 999 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 09:18:44 ]
- 埋め
- 1000 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 09:20:04 ]
- 梅
- 1001 名前:1001 [Over 1000 Thread]
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
|

|