値のスキャン、チェック、変換、コピー…どうやって行うのですか?— C --
質問
かなり時間が経ちましたが、まだ特定のコードを機能させようとしています。さまざまなコマンドなどについて質問しました。以前はありましたが、今はこれが最後の質問になることを願っています (すべての質問を 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);
}
解決
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;
}
最新の例では失敗しています。 alpha
は NULL ポインタです。それを次のように宣言します char alpha[40];
スペースを割り当てます。おそらく、フォーマット文字列で %40s を使用して、 scanf
溢れるから alpha
.
また、使用 strtod
の代わりに atof
変換が成功したかどうかがわかります(あなたの使用方法よりも優れています) isdigit
負の整数では失敗します)。
他のヒント
おそらく使用する必要があります %s
の代わりに %c
そしてそれを入れるために char
配列 (char*
)。おそらく、使用する必要があるエラーが発生する可能性があります 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);
}