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

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

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

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

Q&A

解決済

3回答

2254閲覧

c言語で特定の文字列が入力されるまで配列に文字列を格納し続けるプログラムが上手く書けない

ijuya_yika

総合スコア50

C

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

0グッド

0クリップ

投稿2017/10/25 03:22

編集2017/10/25 03:44

###前提・実現したいこと
c言語で特定の文字列が入力されるまで配列に文字列を格納し続けるプログラムを書く

###発生している問題・エラーメッセージ
(1) while文からbreakするための条件を満たす入力をしてもループから抜け出せない
(2) output_arrに入力した配列を結合する際に改行無しで結合したい

###該当のソースコード

c

1#include <stdio.h> 2#include <string.h> 3 4int main(void){ 5 int MaxInput = 1025; 6 char output_arr[1025]; 7 char input_arr[1025]; 8 9 while(1){ 10 // Read user input 11 puts("Enter a value : "); 12 fgets(input_arr, MaxInput, stdin); 13 14 if(!strcmp(input_arr, "a")) 15 break; 16 else 17 strcat(outputrr, input_arr); 18 19 printf("Input_arr is %s\n", input_arr); 20 printf("So far you entered %s\n", output_arr); 21 } 22 23 return 0; 24} 25 26``` 27 28###試したこと 29printfで実際に入力された文字がinput_arrに格納されているか確認したが(!strcmp(input_arr, "a")の条件に引っかからない 30 31実際に動かしてみると以下の通りになります。 32```text 33Enter a value : 34123 35Input_arr is 123 36 37So far you entered 123 38 39Enter a value : 40456 41Input_arr is 456 42 43So far you entered 123 44456 45 46Enter a value : 47a 48Input_arr is a 49 50So far you entered 123 51456 52a 53 54 55```

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

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

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

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

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

kimurayu

2017/10/25 03:40 編集

実際 input_arr の値と strcmp(input_arr, "a") の値は何になりましたか
ijuya_yika

2017/10/25 03:49

入力する値によって変動します。 例えば3と入力した場合-46, 其の次にAと入れた場合-32, 更に入力でaと入れた場合10となりました
guest

回答3

0

ベストアンサー

printfで実際に入力された文字がinput_arrに格納されているか確認したが(!strcmp(input_arr, "a")の条件に引っかからない

fgetsは改行コードも取得するからです。
aとだけ打ち込んでエンターを押すと、実際にはa\nがinput_arrに与えられます。

output_arrに入力した配列を結合する際に改行無しで結合したい

原因は同様で、改行コードを含んだまま結合されてしまうからです。


改行コードを終端文字に置き換えてしまうといいでしょう。

C

1for(int i = 0; input_arr[i]; i++) { 2 if(input_arr[i] == '\n') { 3 input_arr[i] = '\0'; 4 } 5}

実行結果

Enter a value : hoge Input_arr is hoge So far you entered hoge Enter a value : hoge Input_arr is hoge So far you entered hogehoge Enter a value : piyo Input_arr is piyo So far you entered hogehogepiyo Enter a value : fuga Input_arr is fuga So far you entered hogehogepiyofuga Enter a value : a

投稿2017/10/25 03:50

LouiS0616

総合スコア35658

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

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

ijuya_yika

2017/10/25 04:03 編集

迅速なご回答ありがとうございます。とても助かりました。ただ入力文字数が大きくなるとfor文のループが無駄に感じてしまうのですが、何か別の方法は無いのでしょうか?
LouiS0616

2017/10/25 04:12 編集

yuki-saitoさんの方法で問題なく実行できました。 そちらの方が簡潔でわかりやすく、処理速度の向上も期待できそうです。
guest

0

こんにちは。

(1) while文からbreakするための条件を満たす入力をしてもループから抜け出せない

fgets()はgets()と異なり、(バッファが不足しない限り)改行文字まで含めて読み取ります。
ですので、判定はif(!strcmp(input_arr, "a\n"))とすれば意図通りになるだろうと思います。

(2) output_arrに入力した配列を結合する際に改行無しで結合したい

input_arrに既に改行文字が入っているので、それを単純にstrcat()するとoutput_arrにも改行文字が入ります。
strcat()する前にinput_arrの最後の改行文字を削るのも手です。バッファが不足している時は改行文字が無いので、それを想定する場合は、最後の文字が改行文字だったらそれを'\0'に置き換える等の工夫が必要です。

投稿2017/10/25 03:48

Chironian

総合スコア23272

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

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

ijuya_yika

2017/10/25 04:02

迅速なご回答ありがとうございます。とても助かりました。削る手段としてはfor文でループする等以外の方法ってあるのでしょうか?
Chironian

2017/10/25 04:07

例えば、下記で削れる筈です。(デバッグしてないのでバグがあったらごめんなさい。) int i=strlen(input_arr)-1; if (input_arr[i] != '\n') input_arr[i]=0;
guest

0

input_arrには改行コード\nも一緒に入っています。
そのため一致しないのだと思われます。

output_arrも改行コードも一緒に結合されてしまうので
fgetsしたあとに\n の場所に \0を設定してから処理をすれば大丈夫かと思います。

input_arr[strlen(input_arr)-1] = '\0'

この1行をfgetsの次に入れれば、それ以外の処理は変えなくてもできるはずです。

投稿2017/10/25 03:39

編集2017/10/25 04:05
yuki-saito

総合スコア928

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

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

ijuya_yika

2017/10/25 04:04

タイムリーなご回答ありがとうございます、とても助かりました。
yuki-saito

2017/10/25 04:06

たぶんこの1行入れるだけでできるかと思うのですが、実行環境がなく確認できていないので やってみていただけたらと思います。
ijuya_yika

2017/10/25 04:10

確かにfgets後に↑の1行を追加するだけで解決しました。ところでfgetsは\nも一緒に入ってしまうということなのですが、fgets後のinput_arrの状態は入力を例えばaとしたら [ 'a', '\n', '\0' ]となっているのでしょうか?
yuki-saito

2017/10/25 04:17

はい、そうなります。 先程の1行はフェールセーフ的なことは何も考慮されていないものなので、危険だと感じたらチェックぐらいは入れてもらった方が良いかもしれません! (基本的には入力値なので添え字がマイナスになることはないですが、それでもチェックを入れておく方がより安全です。)
yumetodo

2017/10/25 05:08

ちなみにgets_s(C11で追加)は改行文字を\0に置き換え済みのものを返してくれます
yuki-saito

2017/10/25 06:18 編集

全然そっちの方が良いですね! (C言語を触らなくなってもう7年経つので的確な回答できずすみません。。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問