合計 昨日 今日

入力した文字列が10進数の整数値か調べたい

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: こんぺいとう
[URL]
ぴよぴよ(854 ポイント)
Date: 2017年12月06日(水) 00:28
No: 1
(OFFLINE)

 入力した文字列が10進数の整数値か調べたい

学校の宿題で困っています。
読み込んだ文字列が10進数かそうでないかを判定する関数を作る、というものです。
char型の配列に一文字ずつ読み込んで、一文字ずつ判定するというところまで考え付きましたが、
判定の方法(条件)がよくわかりません。以下考え付いたコードもどきです。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (一文字目が-(マイナス)){
    if (二文字目から最後の文字まで19のみ){
        n=10;
    }else{
        n=0;
    }
}
if (一文字目が19){
    if (二文字目から最後の文字まで09のみ){
        n=10;
    }else{
        n=0;
    }
}
if (一文字目が0){
    if (二文字目に数字またはアルファベットがある){
        n=0;
    }else{
        n=10;
    }
}


よろしくお願いします

Name: purin52002
[URL]
プログラマー(28,889 ポイント)
Date: 2017年12月06日(水) 19:53
No: 2
(OFFLINE)

 Re: 入力した文字列が10進数の整数値か調べたい

こんにちは

私だったら与えられた文字(char)が数値かどうかを判定する関数を作り、
与えられた文字列(char*)を1文字ずつこの関数で判定させ、
すべて数値だったかどうかを判定します。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int IsDigit(char x)
{
    //数値なら1、そうでなければ0を返す
}
 
int syukudai(char *mojiretu)
{
    if(mojiretu == NULL) return 0;
    int kaeriti = 1;
    while(mojiretu != NULL)
    {
        if(IsDigit(*mojiretu) != 1) kaeriti = 0;
    }
    return kaeriti;
}

こんな感じのイメージです。
±の符号や0から始まっているかの判定も付け加えるとしたらもう一工夫必要かもしれません^^;
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

Name: こんぺいとう
[URL]
ぴよぴよ(854 ポイント)
Date: 2017年12月10日(日) 01:48
No: 3
(OFFLINE)

 Re: 入力した文字列が10進数の整数値か調べたい

いろいろ考えていたら返信が遅くなってしまいました。
マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
配列にうまく代入されていないような気がします。
コンパイルエラーは起こりませんでした。
以下書いたコードです。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<stdio.h>
 
int str2int(char *x){
  int a,b;                //aは進数, bは数える用
  a=0;
  b=0;
  if(x[0]=='0'){          //1文字目が0の時
    if(x[1]!='\n'){       //2文字目が改行ではない時
      a=0;
    }else{
      a=10;
    }
  }else if(x[0]='-'){           //1文字目が-
    if(x[1]='\n'){        //2文字目が改行
      a=0;
    }else{
      for(b=1;b<99;b++){
        if(x[b]<='0'||x[b]>'9'){   //数字以外が来るかどうか
          a=0;
          break;
        }
      }
      a=10;
    }
  }else{             //1文字目が1から9だとここに来る(はず)
    if(x[0]='\n'){
      a=0;
    }else{
      for(b=1;b<99;b++){
        if(x[b]<='0'||x[b]>'9'){
          a=0;
          break;
        }
      }
      a=10;
    }
  }
  return a;
}
 
int main(){
  char str[100];
  int i,n;
  i=0;
  n=0;
  printf("Enter a character string:");
  for(i=0;i<99;i++){
    scanf("%c",&str[i]);
    if(str[i]=='\n'){
      break;
    }
  }
  n=str2int(str);
  for(i=0;i<99;i++){
    if(str[i]=='\n'){
      break;
    }else{
      printf("%c",str[i]);
    }
  }
  printf(" is ");
  if(n=10){
    printf("decimal number.\n");
  }else{
    printf("not decimal number.\n");
  }
  str[0]='\0';
  return 0;
}

Name: みけCAT
[URL]
伝説なるハッカー(685,415 ポイント)
Date: 2017年12月10日(日) 02:19
No: 4
(ONLINE)

 Re: 入力した文字列が10進数の整数値か調べたい

こんぺいとう さんが書きました:マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。

とりあえずすぐにわかることは、13行目、14行目、26行目、62行目のif文の中で不自然な代入が行われていますね。

こんぺいとう さんが書きました:配列にうまく代入されていないような気がします。

そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: かずま
[URL]
Date: 2017年12月10日(日) 02:20
No: 5
(OFFLINE)

 Re: 入力した文字列が10進数の整数値か調べたい

こんな感じでしょう。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
int isDecimal(const char *x)
{
    int i = 0;
    if (x[i] が符号であれば)
        i++;            //   次に進む
    if (x[i] が数字でなければ)
        return 0;       //   10進数ではない
    while (x[i] が数字である間)
        i++;            //   どんどん次に進む
    if (x[i] != '\0')   // 終端でなければ(余計な文字があれば)
        return 0;       //   10進数ではない
    return 1;           // 文字列を全部見たので、10進数である
}
 
int main(void)
{
    char str[100];
    while (1) {
        printf("Enter a character string: ");
        if (scanf("%99s", str) != 1)   // 最大99文字の文字列を読み込む
            break;                     //   読み込みが失敗すれば終了    
        if (isDecimal(str))            // 10進数か?
            printf("  %s is a decimal number\n", str);
        else
            printf("  %s is not a decimal number\n", str);
    }
    return 0;
}

Name: みけCAT
[URL]
伝説なるハッカー(685,415 ポイント)
Date: 2017年12月10日(日) 02:32
No: 6
(ONLINE)

 Re: 入力した文字列が10進数の整数値か調べたい

17~22行目、29~34行目のfor文での処理の内容が、それぞれ23行目、35行目でaに10を無条件で代入することによって無効化されています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: こんぺいとう
[URL]
ぴよぴよ(854 ポイント)
Date: 2017年12月10日(日) 20:45
No: 7
(OFFLINE)

 Re: 入力した文字列が10進数の整数値か調べたい

[解決!]

ありがとうございます。
みけCAT さんが書きました:そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。

 printfで確かめる方法をすっかり忘れていました。とても便利でした!

みけCAT さんが書きました:17~22行目、29~34行目のfor文での処理の内容が、それぞれ23行目、35行目でaに10を無条件で代入することによって無効化されています。

 確かにせっかく判定しても結局最後でa=10してますね...

かずまさんのコードを参考にして出来上がったのがこれです!
皆さんありがとうございました!!

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int isDecimal(char *x)
{
  int i=0;
  if(x[i]=='-'){             //最初が-の時
    i++;                       //次から数字かどうか判定するために1進める
  }
  if(x[i]<'0'||x[i]>'9'){        //0から9ではない時
    return 0;                    //10進数ではない
  }else{
    while(x[i]>='0'&&x[i]<='9'){   //数字の時
      i++;                         //どんどん次に進む
    }
    if(x[i]!='\0'){                //終端でなければ(余計な文字があれば)
      return 0;                    //10進数ではない
    }
  }
  return 10;                      //文字列を全部見たので、10進数
}
 
int main(void)
{
  char str[100];
  while(1){
    printf("Enter a character string: ");
    if(scanf("%99s",str)!=1)                   // 最大99文字の文字列を読み込む
      break;                                          // 読み込みが失敗すれば終了
    if(isDecimal(str)){                          // 10進数か?
        printf("'%s' is a decimal number.\n", str);
    }else{
        printf("'%s' is not a decimal number.\n", str);
    }
  }
  return 0;
}

Name: かずま
[URL]
Date: 2017年12月11日(月) 12:07
No: 8
(OFFLINE)

 Re: 入力した文字列が10進数の整数値か調べたい

読み込んだ文字列が10進数かそうでないかを判定する関数
なので true か false、すなわち 1 か 0 を返せばよいはず
なのになぜ、10を返すのでしょうか?
C の整数定数のような 16進定数や 8進定数も判別したかった]
のでしょうか?

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
int isHex(unsigned char c)
{
    return (c>='0' && c<='9') || (c>='a' && c<='f') || (c>='A' && c<='F');
}
 
int getBase(const char *p)
{
    if (*p == '-' || *p == '+') p++;
    if (*p >= '1' && *p <= '9') {
        while (*++p >= '0' && *p <= '9') ;
        return *p ? 0 : 10;
    }
    if (*p == '0') {
        if (*++p == 'x' || *p == 'X') {
            if (!isHex(*++p)) return 0;
            while (isHex(*++p)) ;
            return *p ? 0 : 16;
        }
        while (*++p >= '0' && *p <= '7') ;
        return *p ? 0 : 8;
    }
    return 0;
}
 
int main(void)
{
    char str[100];
    while (1) {
        printf("Enter a character string: ");
        if (scanf("%99s", str) != 1 || str[0] == '.') return 0;
        switch (getBase(str)) {
        case 10: printf("  \"%s\" is a decimal number\n", str); break;
        case 16: printf("  \"%s\" is a hexadecimal number\n", str); break;
        case  8: printf("  \"%s\" is an octal number\n", str); break;
        default: printf("  \"%s\" is not a number\n", str);
        }
    }
    return 0;
}

実行例
コード[Text]: 全て選択
1
2
3
4
5
6
7
8
9
Enter a character string: -123
  "-123" is a decimal number
Enter a character string: 0123
  "0123" is an octal number
Enter a character string: 0x123
  "0x123" is a hexadecimal number
Enter a character string: x123
  "x123" is not a number
Enter a character string: .

本当の C の整数定数には符号は付きません。
また u や LL などの接尾語が付くことがあります。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[16人]