0

しばらく経ちましたが、まだ特定のコードを機能させようとしています。以前、さまざまなコマンドなどについていくつか質問をしましたが、これが最後の質問になることを願っています (すべての質問を 1 つのコードにまとめます)。

私は基本的にしたい:

*入力をスキャンします (文字である必要がありますか?)

*番号かどうかを確認してください

※そうでない場合はエラーを返す

*その文字を浮動小数点数に変換します

*値を別の変数にコピーします (ここでは imp と呼びます)

これが私が思いついたものです:

編集されたコード*

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
main(){  
  int digits;
  float imp=0;
  char* alpha;
  do{

    printf("Enter input\n\n");
    scanf("\n%c",alpha);
    digits=isdigit(alpha);
      if(digits==0){
         printf("error\n\n");
      }
     imp=atof(alpha);
  }while(digits==0);

}

問題は、このコードがまったく機能しないことです... atof は const char でなければならず、変更しようとすると失敗し続けます。私は多くのことを試して失敗し続けていると信じているので、イライラしてここで質問せざるを得ませんが、うまくいくまで安心することはできませんxDだから、あなたの助けが本当に必要です.

このコードが機能しない理由を教えてください。何が間違っているのですか? 私はまだCを学んでおり、あなたの助けに本当に感謝しています:)

atmを指定した編集 エラーは次のとおりです。

Argument no 1 of 'isdigit' must be of type 'const int', not '<ptr>char'

編集 このコードは正常にコンパイルされますが、入力が入力されるとクラッシュします。

  #include<stdio.h>
  #include<stdlib.h>
  #include<ctype.h>
  main(){  
  int digits;
  float imp=0;
  char* alpha=0;
  do{

   printf("Enter input\n\n");
   scanf("\n%s",alpha);
   digits=(isdigit(alpha[0]));
   imp=atof(alpha);
  }while(digits==0);
 }
4

2 に答える 2

1

おそらく%s代わりに使用して、配列%cに入れる必要があります( )。また、使用する必要があるというエラーが発生する可能性があります。charchar*const char*const char

1文字だけを読みたいのではなく、文字列全体を読みたい...

編集

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
main(){  
  int digits,i;
  float imp=0;
  char* alpha = malloc(100); /* 100 is for example */
  do{
    printf("Enter input\n\n");
    scanf("\n%s",&alpha);
    for (i = 0; i != 100; ++i)
    {
      if (alpha[i] == '\0')
        break;
      if (!isdigit(alpha[i]))
      {
        printf("error\n\n");
        return ...;
      }
    }
     imp=atof(alpha);
  }while(true);
}
于 2010-05-12T18:32:21.947 に答える
1

scanf にatof変換させてみませんか?

 #include <stdio.h>
 int main()
 {  
    float imp=0;
    while (1)
    {
       printf("Enter input\n\n");
       if (scanf("%f", &imp) < 1) break;
    }
    return 0;
}

alphaNULL ポインターであるため、最新の例は失敗しています。char alpha[40];スペースを割り当てるように宣言します。scanfオーバーフローを防ぐために、フォーマット文字列で %40s を使用することをお勧めしますalpha

また、strtod代わりに使用するatofと、変換が成功したかどうかがわかります (isdigit負の整数で失敗する which を使用する方法よりも優れています)。

于 2010-05-12T20:15:35.210 に答える