C言語関係掲示板

過去ログ

No.1223 英字以外を含むか確かめる関数

[戻る] [ホームページ]
No.16167

英字以外を含むか確かめる関数
投稿者---lala(2004/08/12 22:23:50)


int hani(char *a)
{
  int j=0;
  /****範囲外か調べる(英字以外を含むか)****/
    while(a[j]!='\0'){
      if(a[j]<'A'||(a[j]>'Z'&& a[j]<'a')||a[j]>'z'){ return 1;}
      j++;
      printf("%d",j);
    }
  return 0;
}




英字以外を含むか確かめる関数です。これを動かすと無限ループに入ってしまいます。何故だか良くわかりません教えてください。jの中身を出力すると常に1となってしますようです。



No.16168

Re:英字以外を含むか確かめる関数
投稿者---monkey(2004/08/12 23:29:56)


このhani関数自体に問題はないと思います。
hani関数を使った次のプログラムは正常に動きました。

int main()
{
    char str1[] = "abcdefgHIJ";
    char str2[] = "abcdefg123";
    int r1 = hani( str1 );
    int r2 = hani( str2 );
    printf( ", result %d, %d\n", r1, r2 );
    return 0;
}

---実行結果---
123456789101234567, result 0, 1

無限ループになる理由として、引数に渡された文字列の終端が'\0'となっていないということは想定できますが、それだとjが常に1ということと矛盾します。
ともあれ、lalaさんがおっしゃるような現象が再現できないので、どうしようもありません。


No.16169

Re:英字以外を含むか確かめる関数
投稿者---たか(2004/08/13 11:03:10)


0〜255の値を渡してみましたが永久ループに入らずに正しく実行できますね。

#include <stdio.h>
#include <ctype.h>

int hani(char *a);

int main(void)
{
  int i;
  char buf[2];
  
  for (i = 0; i < 256; i++) {
    buf[0] = (char)i;
    buf[1] = '\0';
    if (isalnum(i)) 
      printf("%d %d %d %c\n", i, buf[0], hani(buf), i);
    else
      printf("%d %d %d\n", i, buf[0], hani(buf));
  }
  return 0;
}

int hani(char *a)
{
  int j=0;
  /****範囲外か調べる(英字以外を含むか)****/
    while(a[j]!='\0'){
      if(a[j]<'A'||(a[j]>'Z'&& a[j]<'a')||a[j]>'z'){ return 1;}
      j++;
      printf("%d ",j);
    }
  return 0;
}