scantを使って、
入力されたものが、自然数で3が付いていたらyes
自然数でなかったら、エラーが返るようにしたいです。
よかったら教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/26 00:04
2016/01/27 10:15
回答7件
0
scant を英和辞書、ネットで調べてください。(御自身を指しているのかも)
scanf では無いですか?
C系の初心者本、初心者サイトで勉強はしましたか?
言語系の基礎が出来ていない方の、質問の様に見受けられます。
課題や、宿題を、無償で教えて貰っても身につきません。
課題や、宿題は、悩んだり、調べたりする、脳が汗をかく過程が重要です。
(日本人であれば、初等教育で、勉強の仕方は習ったはずです。)
社会人であれば、妙に出来る評価が付くと、後々馬脚が現われて、御自身が辛いだけです。
投稿2016/01/23 09:45
総合スコア2028
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
3の付く整数の時"yes"、3の付かない整数の時"no"、整数で無いとき"error" とすると、scanf系を使うとこんな感じですね。
C
1#include <stdio.h> 2#include <string.h> 3 4#define YES 1 5#define NO 2 6#define ERR 3 7 8int check(char *buf){ 9 int x; 10 char y; 11 if(sscanf(buf,"%d%c",&x,&y)==2 && y=='\n'){ 12 if(strchr(buf,'3')){ 13 return YES; 14 } 15 return NO; 16 } 17 return ERR; 18} 19 20main(){ 21 char buf[100]; 22 fgets(buf,sizeof buf,stdin); 23 24 switch( check(buf) ){ 25 case YES: 26 printf("yes\n"); 27 break; 28 case NO: 29 printf("no\n"); 30 break; 31 case ERR: 32 printf("error\n"); 33 break; 34 } 35} 36
投稿2016/01/23 12:27
編集2016/01/23 12:54総合スコア84538
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/23 12:49
2016/01/23 12:55
2017/02/01 08:54
0
非常に難しい問題だと思います。まず、数字の記法についてどのような物まで認めるかです。"1.0"や"0.1e+1"と言った小数点数表記もありなのか、"4/2"といった分数表記、"1 + 0i"といった複素数表記もありなのか、"0x1"のような十六進数表記もありなのかです。そこで、一つの自然数については最も一般的な(それは日常で用いられる十進数でしょう)ただ一つの表記しか認めないことを前提とします。つまり、"1"は"1"という表記以外は認めないと仮定します。
次に、入力される自然数の大きさです。自然数の最大値はありません。無限に大きくなります。ただコンピュータでは無限に大きい数字は扱えませんので、メモリやターミナル上の制限が許す限りとします。
最後に入力の終了は改行とし、改行自体は入力に含めないもとします。
以上の仮定に基づき、作成してみました。なお、scantはscanfの誤字だと仮定しています。
C
1#include <stdio.h> 2#include <stdbool.h> 3 4// 自然数は1から始まる 5int main(void) 6{ 7 char c; 8 bool three = false; 9 bool natural = false; 10 while (scanf("%c", &c) == 1) { 11 switch (c) { 12 case '\r': case '\n': 13 goto scan_end; 14 case '3': 15 three = true; 16 case '1': case '2': case '4': case '5': 17 case '6': case '7': case '8': case '9': 18 natural = true; 19 break; 20 case '0': 21 if (natural) break; 22 default: 23 natural = false; 24 goto scan_end; 25 } 26 } 27 scan_end: 28 if (natural) { 29 printf(u8"%s\n", three ? u8"yes" : u8"no"); 30 } else { 31 fprintf(stderr, u8"自然数ではありません。\n"); 32 } 33 return 0; 34}
投稿2016/01/23 11:38
総合スコア21735
0
3がない自然数の扱いについて言及されていないので、その場合はnoとすると解釈しました。
ループを使わないやり方もあります。
C
1#include <stdio.h> 2#include <string.h> 3 4// 3が使われている自然数は 0 (yes) 5// 3が使われていない自然数は 1 (no) 6// 自然数でなければ -1 (error) 7// を返します。 8int natural_number_3(const char * str) 9{ 10 size_t len = strlen(str); 11 size_t n = strspn(str, "0123456789"); 12 if(n != len) 13 return -1; 14 const char *p = strchr(str, '3'); 15 return (p != NULL) ? 0 : 1; 16} 17 18int main() 19{ 20 char str[4096]; 21 scanf("%s", str); 22 int res = natural_number_3(str); 23 if(res == 0) 24 printf("yes\n"); 25 else if(res == 1) 26 printf("no\n"); 27 else 28 printf("error\n"); 29 return 0; 30}
投稿2016/01/23 11:19
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/01 13:57
2017/02/01 14:27
0
より多くの回答を得るためにも、5にも条件をつけるとイイと思います。プログラマーは条件が3だけの時よりも、3と5に反応します。ナベアツと同じです。
投稿2017/02/01 14:08
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「返るように」と言う事なので関数にしたほうがよかったと思いますが、main()だけになっちゃいました。
文字列として読み込んで'0'~'9'だけで構成されていて且つ'3'があった場合だけ"yes"を出力しています。もし、数値がほしいのであれば(桁数に依存しますが)atoi(),sscanf()でintやlongに変換できます。
c
1~/test/cpptst >./a.out 2012456 3error 4 5~/test/cpptst >./a.out 60123456 7yes 8 9~/test/cpptst >./a.out 10あいうえお 11error 12 13~/test/cpptst >./a.out 141.02 15error 16 17~/test/cpptst >cat tst02.c 18#include <stdio.h> 19#include <ctype.h> 20 21 22int main() 23{ 24 int flag=0; 25 char num[100]; 26 27 scanf("%s",num); 28 29 for( int i= 0; num[i]; i++ ){ 30 if( !isdigit(num[i])){ 31 //flag= -1; 32 break; 33 } 34 if( num[i] == '3' ){ 35 flag= 1; 36 } 37 } 38 if( flag == 1 ){ 39 puts("yes\n"); 40 }else{ 41 puts("error\n"); 42 } 43 44 return (0); 45} 46~/test/cpptst > 47
投稿2016/01/23 10:41
編集2016/01/23 11:10総合スコア6851
0
こんにちは。
scantを使って、
scanfの間違いですね?
入力されたものが、自然数で3が付いていたらyes
う~ん、これは意味不明です。とりあえず、自然数ならtrue、そうでないならfalseを返却してみます。
yuma.1217さんのやりたいことをもう少し丁寧に説明下さい。
C
1bool check() 2{ 3 double input; 4 if (scanf("%lf", &input) != 1) 5return false; 6 7 if (input < 1.0) 8retun false; 9 10 if (input != floor(input)) 11return false; 12 13 return true; 14}
ビルド/動作確認してませんので、エラーがでたらごめんなさい。
投稿2016/01/23 09:31
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/23 09:40 編集
2016/01/23 09:47
2016/01/23 10:05
2016/01/23 10:44
2016/01/23 10:55
2017/02/01 08:56
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。