質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2781閲覧

C言語 scanf() で入力されたものを 数値と文字、文字列で処理を変えたい

kokok

総合スコア145

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/07/29 06:54

編集2019/07/30 01:05

c

1 2int main(void) { 3 4char inva[1024]; //入力された値 5 6 printf("数字を入力してください(乱数) 文字または文字列を入力してください(ファイル読み込み) "); 7 scanf("%s", &inva); 8 srand((unsigned)inva); 9 10 if (isdigit(inva) == 0) { //入力された値が文字か文字列だった場合 11 12}else if (isdigit(inva) != 0){ //入力された値が数値だった場合 13 14} 15 16

scanf で入力された値が 数値か 文字、文字列かで 処理を変えたいと思ってます。

数値を入力すると else if (isdigit(inva) != 0){ //入力された値が数値だった場合

がちゃんと処理されます。   //   入力値 例: 1 とか  66416326

文字、文字列を入力すると

文字など少ない文字であれば,if (isdigit(inva) == 0) { //入力された値が文字か文字列だった場合

が処理されます。

しかし、長い文字列を入力すると 処理がうまくいきません。  //入力値  例:gseglfbjasvdhvadv

これは、文字列として認識されないのでしょうか?


※ atoi 関数でもできるみたいですが
例えば 1e と入力した場合 1 が 返るみたいですが、  atoiを使ってでも可能でしょうか?

----追記------

isdigit は 複数の文字や数字は 判定することができないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FiroProchainezo

2019/07/29 07:07

そもそもなんですが、invaに1文字しか格納できないのは解決しないのですか?
thkana

2019/07/29 12:53

scanf()のfってのは、どうも"formatted"の略らしいですね。 つまり、formatted=書式化された、書式に則った入力を受け取るのがscanf()です。 逆に言うと、「なんだかわからない」入力を受け付けるのはそもそもscanf()の仕事ではない、とも言えます。 さて、あなたのやりたいことは、本当に"scanf()で入力"することなのでしょうか? それとも、なんらかの手段で入力出来て、それの内容を解析できればいいのですか? また、「数値」「文字」「文字列」の定義はどうなっているのですか? 質問で例に挙げられている1eは実際どういう扱いなのですか? 1までが数字だから数値? 1e全体では数値ではないから文字列? 文字と文字列の違いも不明です。空白や改行文字は文字として扱いますか? キーボードが標準入力に繋がっている場合、普通はなにかの文字を入力する際には改行文字が付くように入力されますが。では、'文字'の入力とはどういうものでしょう?
guest

回答3

0

数値を入力すると else if (isdigit(inva) != 0){ //入力された値が数値だった場合がちゃんと処理されます。

いえ、たまたまそう見えるだけで、これはバッファオーバーフローを起こしています。char inva;である以上、1文字分のメモリしかありませんので、"%s"の結果を流せば、空文字列でない限り確実にはみ出します。

いったん、十分なバッファを用意してfscanfなどで受けて、strtolで変換をかければ、「得られた値が数値だった」かそうでなかったかの判別にもなります。

投稿2019/07/29 07:01

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

scanfの%s書式で入力する場合、十分おおきなバッファを確保してください。
char inva[1024]; //入力された値
scanf("%s", inva);
のようにすればOKです。
次に、これが、数字からのみ構成されるか、数字以外の文字が混じっているかを判定するためには、自前で
そのような判定ルーチンを作るしかありません。
数字は、int型に変換することを想定して、0~999999999(9桁)の範囲をOKとします。
正確には、0~2147483647なのですが、そこまでやると大変なので、0~999999999が正常範囲とします。
以下のようなニューメリック関数を作成します。
戻り値は、数字以外の文字が含まれる場合、-1を返します。(10桁以上の数字の場合も-1を返します)
正常時は、数字を10進数の数値に変換した結果を返します。

C

1#include <stdio.h> 2#include <string.h> 3int check_numeric(char str[]){ 4 int retval = 0; 5 int len; 6 int i; 7 len = strlen(str); 8 if (len>9) return -1; //10桁以上の文字はエラー 9 for (i = 0; i < len;i++){ 10 if (str[i] < '0' || str[i] > '9') return -1; //0~9以外の文字はエラー 11 retval = retval * 10 + (str[i]-'0'); 12 } 13 return retval; 14} 15int main(void) { 16 17 char inva[1024]; //入力された値 18 int ans; 19 printf("数字を入力してください(乱数) 文字または文字列を入力してください(ファイル読み込み) "); 20 scanf("%s", inva); 21 printf("<%s>\n",inva); 22 ans = check_numeric(inva); 23 printf("ans=%d\n",ans); 24} 25

0~9の文字の判定ですが、
windowsかlinuxであれば、正しく動作します。(ASCIIコード前提です)

投稿2019/07/29 12:25

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokok

2019/07/30 00:59

retval = retval * 10 + (str[i]-'0');  ここの部分の -'0' は何を表しているのでしょうか?
tatsu99

2019/07/30 01:56

'0'~'9'の1文字を0~9の数値に変換しています。 '0'はASCIIコードの48(16進数の0x30) '9'はASCIIコードの57(16進数の0x39)です。 '9'=57から9の数値を作成するには'0'=48を引けばよいです。 '9'-'0'は9となります。
guest

0

既に指摘がありますが、

char inva;

せめて、 char buff[1024]; とかにしましょう。
そうすれば、
scanf("%s", buff); とする事で、 1023文字の入力まで OKとなります。
で、 if (isdigit(buff[0]) { とかしましょう。


まあ、scanf() より、fgets(buff, 1023, stdin) の方が推奨ですが、、。

投稿2019/07/29 12:06

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問