C言語なら俺に聞け(入門篇) Part 34at TECH
C言語なら俺に聞け(入門篇) Part 34 - 暇つぶし2ch470:402
08/08/20 09:34:26
>>440
ありがとうございます。
今作っている物は1秒ごとの判断で良かったので最終的にtime()関数を使うことにしました。
gettymeofday();も今度試してみます。

471:デフォルトの名無しさん
08/08/20 10:39:41
このプログラムなら正常に動くんですが、main関数内のnibai関数を
scanf("%d",&a);
nibai(a);
printf("二倍した数値は%d\n",a);
と書くと2倍してくれないんですが、何故でしょうか?
-----------------------------------------------------------
#include<stdio.h>
int nibai(int x);
int main(void){
int a;
printf("数値を入力してください:");
scanf("%d",&a);
printf("二倍した数値は%d\n",nibai(a));

return 0;}
int nibai(int x){
int wk;
wk=x*2;

return wk;}

472:デフォルトの名無しさん
08/08/20 10:59:39
a = nibai(a);

473:デフォルトの名無しさん
08/08/20 11:00:37
あーなるほど!!
ありがとうございます。

474:ym
08/08/20 13:43:00
受け渡された文字列が'0000'~'2359'の時刻範囲内かをチェックする
プログラムを教えてください。お願いします。
チェック内容は以下の通りです。
1. 受け渡された文字列が全て数値であること。
2. 受け渡された文字列の先頭2文字が'00'~'23'の範囲であること。
3. 受け渡された文字列の3文字目~4文字目が'00'~'59'の範囲であること。
正常終了時:return 0
異常終了時:return -1(時刻範囲外)


475:デフォルトの名無しさん
08/08/20 13:45:10
教えて欲しいのではなく宿題を丸投げしたいだけなら
宿題スレへ行ってください。


476:デフォルトの名無しさん
08/08/20 13:48:49
なんか最近範囲内チェックの質問多いな。全部同じやつか?

477:ym
08/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:デフォルトの名無しさん
08/08/20 13:59:57
たぶん、数字以外で数値に変更できなかったから0になって0時0分は有効だから、じゃない?
isdigit とかで先にチェックするとか。

479:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/20 14:01:42
>>477
atoiで変換は失敗すると0を返すからじゃね

481:デフォルトの名無しさん
08/08/20 14:02:11
あ、n消し忘れた

482:デフォルトの名無しさん
08/08/20 14:03:47
>>479
4桁目のチェックが抜けてないか?

483:デフォルトの名無しさん
08/08/20 14:05:20
>>482
必要あるか?

484:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/20 14:07:05
>>483
ある
[3]が\0のときも無視して通してしまう

486:デフォルトの名無しさん
08/08/20 14:09:08
2桁目も

  switch(argv[1][0])
  {
    case '0': case '1': if(argv[1][1]) break;

だな

487:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/08/20 14:30:40
>関数を呼ぶ前に連絡用構造体の所定のエリアに2次元配列のポインターを格納してます。
>(unsigned int* )hoge->ptr = hoge2div;
こっちが正解です
hoge->ptr = hoge2div;

490:デフォルトの名無しさん
08/08/20 14:36:52
unsigned int (*p)[DIV1_SIZE]=(unsigned int (*)[DIV1_SIZE])hoge->ptr;


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch