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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こんぺいとう
記事: 12
登録日時: 6年前

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

#1

投稿記事 by こんぺいとう » 6年前

学校の宿題で困っています。
読み込んだ文字列が10進数かそうでないかを判定する関数を作る、というものです。
char型の配列に一文字ずつ読み込んで、一文字ずつ判定するというところまで考え付きましたが、
判定の方法(条件)がよくわかりません。以下考え付いたコードもどきです。

コード:

if (一文字目が-(マイナス)){
    if (二文字目から最後の文字まで1~9のみ){
        n=10;
    }else{
        n=0;
    }
}
if (一文字目が1~9){
    if (二文字目から最後の文字まで0~9のみ){
        n=10;
    }else{
        n=0;
    }
}
if (一文字目が0){
    if (二文字目に数字またはアルファベットがある){
        n=0;
    }else{
        n=10;
    }
}
よろしくお願いします

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

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

#2

投稿記事 by purin52002 » 6年前

こんにちは

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

コード:

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^

こんぺいとう
記事: 12
登録日時: 6年前

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

#3

投稿記事 by こんぺいとう » 6年前

いろいろ考えていたら返信が遅くなってしまいました。
マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
配列にうまく代入されていないような気がします。
コンパイルエラーは起こりませんでした。
以下書いたコードです。

コード:

#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;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 6年前

こんぺいとう さんが書きました:マイナスが先頭の時も考えなければならないのですがどうもうまく動きません。
とりあえずすぐにわかることは、13行目、14行目、26行目、62行目のif文の中で不自然な代入が行われていますね。
こんぺいとう さんが書きました:配列にうまく代入されていないような気がします。
そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

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

#5

投稿記事 by かずま » 6年前

こんな感じでしょう。

コード:

#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;
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#6

投稿記事 by みけCAT » 6年前

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

こんぺいとう
記事: 12
登録日時: 6年前

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

#7

投稿記事 by こんぺいとう » 6年前

ありがとうございます。
みけCAT さんが書きました: そういう仮説を立てたなら、デバッガやprintfデバッグなどで本当にそうなのか検証してみるといいでしょう。
 printfで確かめる方法をすっかり忘れていました。とても便利でした!
みけCAT さんが書きました:17~22行目、29~34行目のfor文での処理の内容が、それぞれ23行目、35行目でaに10を無条件で代入することによって無効化されています。
 確かにせっかく判定しても結局最後でa=10してますね...

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

コード:

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;
}

かずま

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

#8

投稿記事 by かずま » 6年前

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

コード:

#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;
}
実行例

コード:

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 などの接尾語が付くことがあります。

こんぺいとう
記事: 12
登録日時: 6年前

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

#9

投稿記事 by こんぺいとう » 5年前

10を返すのは問題文でそうするように指示があったからです。

返信

“C言語何でも質問掲示板” へ戻る