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

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

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

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

Q&A

2回答

1756閲覧

入力した単語に空白を入れて文章を作る方法が分かりません

tatama

総合スコア0

C

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

0グッド

0クリップ

投稿2020/10/24 07:34

編集2020/10/24 11:30

前提・実現したいこと

C言語で単語を4回入力し、スペースを入れてそれを繋げて最後にピリオドを表示させたいです あと、最後に文字数の合計を表示させたいです

発生している問題・エラーメッセージ

コンパイルはできたのですが、入力しても何も表示されず、文字数も1になってしまいました

該当のソースコード

#include <stdio.h>
#include <string.h>

#define NUM 4

int main()
{
char str2[NUM][20]; /* 入力用の文字配列 /
char newstr[80]; /
出力用の文字配列 /
int i;
/
ここにその他の変数宣言 */
int n;
printf( "Input %d words: \n", NUM );

for( i = 0; i < NUM; i++ ){
scanf("%s", str2[i]);
}

/* 入力済みのstr2をもとに、newstrを作成する処理を書く /
/
単語間にスペースを入れる事と、最後はピリオドで終わることに注意 */
for(n = 0;n < i;n++){

strcpy(str2[n]," "); strcpy(newstr,str2[n]); new str[n+1] = ‘.’;

printf("%s\n", newstr); /* 新しい文字列全体を表示 /
}
/
ここで、newstrの文字数を表示 */
printf("Total: %d characters\n",strlen(newstr));
return 0;
}

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

ozwk

2020/10/24 09:16

穴埋めならどこが穴埋め部分なのかを質問文に追記してください
tatama

2020/10/24 09:27

#include <stdio.h> #include <string.h> #define NUM 4 int main() { char str2[NUM][20]; /* 入力用の文字配列 */ char newstr[80]; /* 出力用の文字配列 */ int i; /* ここにその他の変数宣言 */ int count = 0; printf( "Input %d words: \n", NUM ); for( i = 0; i < NUM; i++ ){ scanf("%s", str2[i]); } /* 入力済みのstr2をもとに、newstrを作成する処理を書く */ /* 単語間にスペースを入れる事と、最後はピリオドで終わることに注意 */ newstr = str2; printf("%s\n", newstr); /* 新しい文字列全体を表示 */ /* ここで、newstrの文字数を表示 */ return 0; } 問題の元々の文がこういう感じです 本当にすみません
ozwk

2020/10/24 09:57

質問文は編集できます
dodox86

2020/10/24 10:18

回答をいただいたあとのコメント[tatama 2020/10/24 18:27]ですが、穴埋めの元の問題から推測するに、 「改行を空白に置き換える」のが必要な訳ではありませんね。質問の前提が崩れます。
tatama

2020/10/24 10:20

そうですね!変えます すみません
kazuma-s

2020/10/27 11:07

質問を編集してコードの前後に、```C と ``` を入れてください。 問題の元のコードも同様に質問に追記してください。 上のコメントのコードが元のコードだとすると、間違いがあります。 ・char newstr[80]; だと、19文字の単語4つと、スペース3つと、ピリオド1つと、文字列終端の '\0' を入れることができません。 ・newstr = str2; はコンパイルエラーになります。
guest

回答2

0

scanf("%s", str2[i]);で入力される文字列は空白や改行は含まれないので、そもそも「文章を入力し、改行を空白に変えて、」の前提が成り立ちません。

投稿2020/10/24 08:22

otn

総合スコア84533

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

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

tatama

2020/10/24 08:27

そうなんですか?入れることはできると思いますけど
otn

2020/10/24 08:33

キーボードから入れても、%s では取り込まれません。
Daregada

2020/10/24 08:34

scanf関数では半角空白、タブ、改行などの空白類を区切り文字として使います。つまり、最初の空白類の手前までしかstr2[i]に入りません。fgetsを使ってください。
tatama

2020/10/24 09:13

この問題は最初からコードが用意されていて、空いている部分を補うという形なのであまりこの状態から変えられないんです なのでscanfのところはそのままじゃないとだめだと思います 二次元配列を宣言した時4つまでとなっているので改行を入れても4つまでなら大丈夫なのではないでしょうか
y_waiwai

2020/10/24 09:17

最初にそれ書いとこうよw
tatama

2020/10/24 09:22

すみません........気をつけます
otn

2020/10/24 09:44

回答に書いた通りの繰り返しですが、scanf の %s では改行を取り込めません(改行は消える)ので、そのまま出力すれば改行は出力されないので、それで良いかと思います。 「scanfして、printfして、空白もprintfして」を繰り返せば良い。
tatama

2020/10/24 09:56

では単語の間にスペースを入れるにはどうすればいいですか? 入力 単語 単語 単語 単語 出力 単語 単語 単語 単語みたいな感じです 説明不足で本当にすみません
otn

2020/10/24 10:04

> 「scanfして、printfして、空白もprintfして」を繰り返せば良い。 と書いたとおりです。
tatama

2020/10/24 10:37

なるほど 何となくはわかってきたのですが、単語を文にした後、新しい変数でそれを表示しなければならないのですがこれはどうすればいいのでしょうか?あと最後に入力した単語だけスペース入れないようにするにはどうすればいいのでしょうか?
otn

2020/10/24 10:53

前半は意味が分かりません。 後半は、処理の順番を入れ替えて、 「scanfして、空白を出力して、入力したものを出力して」を繰り返すことにして、1回目だけは空白を出力しない。
otn

2020/10/24 10:56

ああ、入力しながら出力するんじゃなくて、newstr に全部格納してから一気に出力すると言うことですね。 であれば、出力する代わりに格納すれば良いです。 「scanfして、空白をnewstrに追記して、入力したものをnewstrに追記して」の繰り返しで、1回目だけ空白の追記をしない。
tatama

2020/10/24 11:03

すみません もう少し詳しく教えて頂いてもよろしいでしょうか.....?
otn

2020/10/24 11:11

何が分かりませんか?
tatama

2020/10/24 11:21

あ すみません エラーは出なくなりました アドバイスを参考に自分なりに書き直したのでどこが間違っているのか教えていただけませんか?
otn

2020/10/24 11:29

回答を読み返して下さい。回答に分からない点があれば聞いて下さい。
tatama

2020/10/24 11:36

何故入力した単語が表示されないのでしょうか?
otn

2020/10/24 12:01

strcpyしているからでは? 追記は、strcatです。
tatama

2020/10/24 12:04

strcpy とstrlenしか使えないみたいです
coco_bauer

2020/10/24 12:05

もらった回答をちゃんと読みましょう。 そして、回答する人が判るように丁寧な説明をしてください。 「アドバイスを参考に自分なりに書き直したのでどこが間違っているのか教えていただけませんか?」って、どのプログラムを元にして、どこをどう書き直したのかを説明するのは質問者しか出来ない事です。それの間違いを教えてもらえると思えるのは何故なんでしょう? 見ず知らずの他人がした事が判る訳がないと思いませんか。
tatama

2020/10/24 12:14

すみません.......プログラミングを始めたばかりなので回答を見ても分からず、それを質問しようとしたのですが..........
otn

2020/10/24 12:18

回答が分からないときは回答のどの部分が分からないか訊くように書いたのですが、それも無理ですか?
tatama

2020/10/24 12:24

ご不快に思われたなら本当に申し訳ございません........ strcpy(str2[n]," "); strcpy(newstr,str2[n]); new str[n+1] = ‘.’; のところで空白をstr2[n]に空白を入れて、次の行でnewstrにコピーし、次の行でピリオドを格納するということをやったつもりでした 結果では空白しか出ませんでした 説明が足りず重ね重ね本当にすみません........情報としてはこれで足りるでしょうか?
tatama

2020/10/24 12:27

読んでいるうちに回答はなんとなくわかりました なのでプログラムを書き直したのでそれを見て頂きたかったんです.......本当にすみません........
y_waiwai

2020/10/24 12:28

えーと、何かの課題を解いているなら、その疑問を聞くのは、先生とか講師であるべきで、なんの関係もない赤の他人に聞くべきもんじゃありません。 また、善意の第三者である私達のするべきこととして、そのものズバリの解答をあなたに教えるということは絶対に避けるべきものと考えている、ということは理解できるでしょうか。 これをしてしまうと、あなたがこの言語を理解するという機会を奪ってしまうこととなります ということで、あなたのわからないことを教える程度のことはしますが、それ以上のことは期待しないようにしましょう。
tatama

2020/10/24 12:30

毎回説明も足りず、わかりにくい書き方で本当にすみません.........回答がわからなかったというよりは回答をふまえてどのようにプログラムを書くかがよくわからなかった感じです........すみません........
tatama

2020/10/24 12:35

答えを直接教えてもらえるとは思っていません 自力でやるつもりです でも自分で書いたプログラムが正常に動作しないためどこらへんが間違っているのかとか こういうやり方でやったほうがいいとか、そういうヒントのようなものを頂けたらいいなと思い質問させていただいています 誤解を与えてしまい本当に申し訳ございません.......
otn

2020/10/24 12:36

strcat を使うべき所でstrcpyを使っているのが間違いですと回答したのですが。
tatama

2020/10/24 21:18

本当にすみません 理解しております ですが上記でもお話しした通りstrcpyとstrlenしか使ってはいけない問題らしいので、strcpyを使ってしまいました strcarを使わずにできる方法はあるのでしょうか......?せっかくお答え頂いたのに本当にすみません
otn

2020/10/25 02:05

strcatと同じ事をやればいいです。
guest

0

google翻訳
prog03.c:17:16: warning: ポインタと整数の比較

char str2[NUM][20]; /* 入力用の文字配列 */

こういう定義なので、

if(str2[i] == '\n')str2[i] =' ';

str2[i] ってのは、配列のアドレスになるんで、文字定数とは比較できません

投稿2020/10/24 07:41

編集2020/10/24 07:43
y_waiwai

総合スコア87774

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

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

tatama

2020/10/24 07:47

ではどうすれば比較できるのですか?
kazuma-s

2020/10/27 11:10

比較する必要はありません。 scanf で入力した文字列は str[i] に格納されていますが、そこには '\n' は含まれていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問