[表示 : 全て 最新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/

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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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