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

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

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

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

Q&A

7回答

7773閲覧

自然数以外が入力されたらエラー、3が付いていたら何かが返るようにしたい

yuma.1217

総合スコア8

C

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

0グッド

0クリップ

投稿2016/01/23 09:15

scantを使って、

入力されたものが、自然数で3が付いていたらyes

自然数でなかったら、エラーが返るようにしたいです。

よかったら教えてください。

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

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

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

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

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

cateye

2016/01/23 09:33 編集

scant? scanf? ・・・cならばscanf()だと思いますが違いますか? 「自然数以外」と言う事はアルファベット、負数、漢字など0~9以外の文字が入力されたらと言う事でしょうか?
hsk

2016/01/26 00:04

こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました 「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。
WoodenHamlet

2016/01/27 10:15

こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました 「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。
guest

回答7

0

scant を英和辞書、ネットで調べてください。(御自身を指しているのかも)
scanf では無いですか?
C系の初心者本、初心者サイトで勉強はしましたか?
言語系の基礎が出来ていない方の、質問の様に見受けられます。
課題や、宿題を、無償で教えて貰っても身につきません。
課題や、宿題は、悩んだり、調べたりする、脳が汗をかく過程が重要です。
(日本人であれば、初等教育で、勉強の仕方は習ったはずです。)
社会人であれば、妙に出来る評価が付くと、後々馬脚が現われて、御自身が辛いだけです。

投稿2016/01/23 09:45

daive

総合スコア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
otn

総合スコア84538

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

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

catsforepaw

2016/01/23 12:49

スペースを無視して良いのであればなかなか面白いやり方ですね。 あと、yはintではなくcharにすべきですね。
otn

2016/01/23 12:55

すいません。普段 %c とか使わないのでうっかりしました。訂正しておきます。
hikochang

2017/02/01 08:54

負の値が自然数として扱われている気がします。 x>0 という条件も必要です。 0が自然数かどうかという議論もありますが、今回は3を含むという条件があるので検討不要ですね。
guest

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

raccy

総合スコア21735

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

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

hikochang

2017/02/01 14:00

質問者ではないので正解か分かりませんが、この回答に一票! break無しcase文とか使っちゃう辺りは微妙ですが、そのツッコミも覚悟の上の回答と読みました。
guest

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

catsforepaw

総合スコア5938

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

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

hikochang

2017/02/01 13:57

03とか弾けませんよね?
catsforepaw

2017/02/01 14:27

だいぶ前のことなのですっかり忘れていますが、上のコードでは弾いていませんね。要件に含まれていないので処理しなかっただけでしょう。'03'を弾くべきかどうかは私の一存では判断できません。
guest

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
cateye

総合スコア6851

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

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

cateye

2016/01/23 11:20

scanf()はかなり危険な関数です。上記の場合101文字以上の入力があると間違いなくスタックを壊します。なので、注意して使いましょう。
hikochang

2017/02/01 08:58

003もYESになりそうですね、結構完璧を目指すのは難しいですね。
guest

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

Chironian

総合スコア23272

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

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

cateye

2016/01/23 09:40 編集

えっと、自然数には少数は含まれないです。 http://www.weblio.jp/content/%E8%87%AA%E7%84%B6%E6%95%B0 「自然数」 1 ・ 2 ・ 3 ・ 4 …と続く数の総称。正の整数。 0 を含めることもある。 あと、yumaさん"0123456789"の場合、3が含まれているのでyesなのでしょうか?
Chironian

2016/01/23 09:47

> if (input != floor(input)) > return false; これで小数を除いてますよ?
cateye

2016/01/23 10:05

「入力されたものが~」とあるので、入力値そのものが少数を含んでいたらダメだと思うのですが?
Chironian

2016/01/23 10:44

つまり、1.0は自然数ではない。有効桁数云々の文脈では確かにその通りですね。 でも、コンピュータ処理の場合は必ずしもそうでもないような... ところで、「少数」ではなく「小数」ですよ。
cateye

2016/01/23 10:55

「「少数」ではなく「小数」ですよ。」・・・^^;しっつれいしましたmm
hikochang

2017/02/01 08:56

元の質問の3を含まないという条件がなぞなぞ感があるので、細かいところまでこだわると、Doubleで表現できない数字に対応できないので、文字列で処理しないとダメかもですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問