1 名前:静的領域の名無しさん mailto:sage [2008/08/12(火) 18:23:10 ] C言語の入門者向け解説スレです。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 114代目 pc11.2ch.net/test/read.cgi/tech/1216746971/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 33 pc11.2ch.net/test/read.cgi/tech/1217073697/ 過去スレ 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
477 名前:ym [2008/08/20(水) 13:57:04 ] char hh[3]; char mm[3]; int h; int m; hh[0]=pstime[0]; hh[1]=pstime[1]; hh[2]='\0'; mm[0]=pstime[2]; mm[1]=pstime[3]; mm[2]='\0'; h=atoi(hh); m=atoi(mm); if((h >= 0 && h <= 23)&& (m >= 0 && m <= 59)){ return RET_OK; }else{ return RET_NG; } } int main(void) { char str[256]; int chk; gets(str); chk = N60901D04(str); printf("\nreturn=%d\n",chk); } 受け渡された文字列が'0000'〜'2359'の時刻範囲内かをチェックするプログラムなんですけど、コンパイルをしたら、 アルファベット4文字を入力してもreturn 0(正常)で判定されてしまったん ですけど、プログラムの中のどこが悪かったのか、教えてください。お願いします。
478 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 13:59:57 ] たぶん、数字以外で数値に変更できなかったから0になって0時0分は有効だから、じゃない? isdigit とかで先にチェックするとか。
479 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:00:28 ] >>474 int main(int argc, char *argv[]) { char *p; int n; for(p=argv[1] ; *p ; p++) switch(*p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; default: return -1; } switch(argv[1][0]) { case '0': case '1': break; case '2': switch(argv[1][1]) { case '0': case '1': case '2': case '3': break; } default: return -1; } switch(argv[1][2]) { case '0': case '1': case '2': case '3': case '4': case '5': break; default: return -1; } return 0; }
480 名前:デフォルトの名無しさん [2008/08/20(水) 14:01:42 ] >>477 atoiで変換は失敗すると0を返すからじゃね
481 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:02:11 ] あ、n消し忘れた
482 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:03:47 ] >>479 4桁目のチェックが抜けてないか?
483 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:05:20 ] >>482 必要あるか?
484 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:05:42 ] >>482 あーそうだね switch(argv[1][2]) { case '0': case '1': case '2': case '3': case '4': case '5': if(argv[1][3]) break; default: return -1; } こうか
485 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:07:05 ] >>483 ある [3]が\0のときも無視して通してしまう
486 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:09:08 ] 2桁目も switch(argv[1][0]) { case '0': case '1': if(argv[1][1]) break; だな
487 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:22:21 ] int check_time(const char *hhss) { int i, hour, second; if (strlen(hhss) != 4) return -1; for (i = 0; i < 4; i++) if (!isdigit(hhss[i])) return -1; hour = (hhss[0] - '0') * 10 + (hhss[1] - '0'); second = (hhss[2] - '0') * 10 + (hhss[3] - '0'); return (0 <= hour && hour < 24 && 0 <= second && second < 60) ? 0 : -1; }
488 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:29:42 ] 教えてください int型の2次元配列の先頭のポインターだけをもらってくる関数があります。 配列のサイズはわかっているんですが関数内で見る際にはどう記述すればいいでしょうか? これを関数内でいじりたい unsigned int hoge2div[100][200]; 関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。 (unsigned int* )hoge->ptr = hoge2div; 関数内の定義(ここを直したい。) unsigned int* 2div = (unsigned int* )2div->ptr;
489 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:30:40 ] >関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。 >(unsigned int* )hoge->ptr = hoge2div; こっちが正解です hoge->ptr = hoge2div;
490 名前:デフォルトの名無しさん mailto:sage [2008/08/20(水) 14:36:52 ] unsigned int (*p)[DIV1_SIZE]=(unsigned int (*)[DIV1_SIZE])hoge->ptr;