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

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

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

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

Q&A

3回答

568閲覧

空白があったらもう一度入力させたい

gyoruo

総合スコア61

C

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

0グッド

0クリップ

投稿2020/08/20 06:38

編集2020/08/20 06:54

入力の最初や途中に空白文字があったらもう一度入力させるプログラムを作りたいのですが、文字が入っていても繰り返されてしまいます。なぜでしょうか?

C

1#include <stdio.h> 2 3int main() { 4 char name[10]; 5 char Name_Len; 6 char flag = 0; 7 char cnt = 0; 8 char *check; 9 10 while (flag == cnt) { 11 printf("名前入力して>>"); 12 fgets(name, 10, stdin); 13 14 // 配列の最後を\0にする処理 15 Name_Len = strlen(name) - 1; 16 name[Name_Len] = '\0'; 17 18 check = strchr(name, ' '); 19 20 if ((strlen(name) <= 10) && !check) { 21 printf("%s:ok\n", name); 22 cnt++; 23 } else { 24 printf("%s:no\n", name); 25 } 26 } 27 28 return 0; 29}

イメージ説明

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

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

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

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

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

guest

回答3

0

fgets(name, 10, stdin); で入力したら、
(strlen(name) <= 10) は常に真です。書いても意味がありません。

次のように書けば、flag も cnt も不要です。

C

1#include <stdio.h> // printf, fgets 2#include <string.h> // strchr, strlen 3 4int main(void) 5{ 6 char name[256]; 7 8 while (1) { 9 printf("名前入力して>>"); 10 if (!fgets(name, sizeof name, stdin)) break; 11 char *p = strchr(name, '\n'); 12 if (p) *p = '\0'; 13 if (strlen(name) <= 10 && !strchr(name, ' ') && name[0]) { 14 printf("%s:ok\n", name); 15 break; 16 } 17 printf("%s:no\n", name); 18 } 19 return 0; 20}

投稿2020/08/21 04:37

編集2020/08/21 04:41
kazuma-s

総合スコア8224

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

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

gyoruo

2020/08/22 14:38

そんなスマートなやり方もあるんですね! ご回答ありがとうございます。
guest

0

以下のコードでできました!
if ((strlen(name) <= 10) && !strchr(name, ' ') && !(name[0] == '\0'))のように変更しました。

C

1#include <stdio.h> 2 3int main() { 4 char name[10]; 5 char flag = 0; 6 char cnt = 0; 7 char i = 0; 8 9 while (flag == cnt) { 10 printf("名前入力して>>"); 11 fgets(name, 10, stdin); 12 13 // 配列の最後を\0にする処理 14 name[strlen(name) - 1] = '\0'; 15 16 if ((strlen(name) <= 10) && !strchr(name, ' ') && !(name[0] == '\0')) { 17 for (i = 0; i < strlen(name);i++) { 18 printf("[%c]\n", name[i]); 19 } 20 printf("%s:ok\n", name); 21 cnt++; 22 } else { 23 printf("%s:no\n", name); 24 } 25 } 26 27 return 0; 28}

投稿2020/08/20 08:28

編集2020/08/21 02:22
gyoruo

総合スコア61

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

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

thkana

2020/08/23 01:33

"12345678 " (8の次が空白)という入力に対してはどのような結果が得られることを期待しますか?
gyoruo

2020/08/23 02:29

アドバイスありがとうございます! 試しましたが、確かにnoの方にいってしまいますね・・・ 直してみます!
gyoruo

2020/08/23 02:30

最後に空白が入ったとしてもそれまでの値は実行させたいので直してみます!
kazuma-s

2020/08/23 03:30

"12345678 " (8の次に空白が 3つ) という入力は ok ですか、no ですか? ok の場合、空白も name に残したままでいいんですか? 10文字以下という制限は空白を除いてですか、それとも後続の空白も含めてですか?
gyoruo

2020/08/23 05:33

空白が1つどの位置にあってもnoにしようとしています。 確かに、nameに残したままだと余計なメモリ食ってしまうので、その処理も必要ですね。。。
thkana

2020/08/23 09:56

> 最後に空白が入ったとしてもそれまでの値は実行させたいので直してみます! これは okにしたい、ということですか? では、"123 "(3の次が空白)もokになるのですか? > 空白が1つどの位置にあってもnoにしようとしています。 と矛盾するような気がしますが。
gyoruo

2020/08/23 12:33

> 最後に空白が入ったとしてもそれまでの値は実行させたいので直してみます! いや、すみません、空白が1つでもどこかの場所に入った時点でnoにしたいです。
thkana

2020/08/23 12:42

わたしのてもとでは、 "12345678 " (8の次が空白)という入力に対して"ok"になったので先のコメントだったわけですが。"no"になりましたか? どちらが期待する動作ですか。
kazuma-s

2020/08/23 13:17

文字数制限の仕様もはっきりさせてください。
gyoruo

2020/08/23 13:43

混乱させて申し訳ございません。 文字数制限は特になく([256]バイト以下)半角スペースが1箇所でも入ればnoにしたいといった処理を実現したかったです。 次からはより具体的に記載します。
guest

0

flag、cntが初期化されずに使用されています
まずはこれをどーにかしよう

そして、strchr関数の戻り値はcharではありません。

投稿2020/08/20 06:49

編集2020/08/20 06:52
y_waiwai

総合スコア88042

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

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

gyoruo

2020/08/20 06:52

アドバイスありがとうございます。
gyoruo

2020/08/20 06:54

ポインタでしたね、、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問