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

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

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

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

Q&A

解決済

3回答

195閲覧

C言語についてです(ファイル入出力)

Cchan

総合スコア35

C

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

0グッド

0クリップ

投稿2018/10/24 14:47

char型の配列3つに文章1行ずつ終端までループで順番に上書きするプログラムを作りたいのですが,結果として複数回同じ文章が入ってしまいます・・・。

よろしくお願いいたします。

C

1#include<stdio.h> 2int main(){ 3 4char buf [100]; 5char *tmp [100]; 6 7 8int count=0; 9while(fgets(buf,sizeof(buf),stdin)!=NULL){ 10 11tmp[count%3]=buf; 12 13 14 15 count +=1; 16} 17 18for(int i=0;i<3;i++){ 19 20 printf("%s",tmp[i]); 21 22} 23 24return 0; 25}

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

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

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

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

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

moonphase

2018/10/24 15:00

char型の配列3つにとはどういうことですか?また、count%3してるのは何故ですか?あと、char *tmp[100]に文字をコピーしたいならmallocしてstrcpyしなければいけません。
Cchan

2018/10/24 15:23

char型の[100]の領域を持つ配列を3つ作ってそこに順番に上書きすることが出来ないかとかんがえたのですが、どのように実装したらよいでしょうか・・・ linuxコマンドのtailのようなものを実装しようと考えていました。
guest

回答3

0

どうぞ。前の質問の方にも書いちゃったので向こうは消しておきます。

#include <stdio.h> int main(){ char buf[3][100]; int count = 0; while (fgets(buf[count], sizeof(buf[count]), stdin) != NULL) { count = (count + 1) % 3; } for (int i = 0; i < 3; i++) { printf("%s", buf[i]); } return 0; }

投稿2018/10/24 15:34

編集2018/10/24 15:34
set0gut1

総合スコア2413

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

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

Cchan

2018/10/24 16:06

有難うございます!!
guest

0

ベストアンサー

char型の[100]の領域を持つ配列を3つ作ってそこに順番に入れる

であれば以下です。

c

1#include <stdio.h> 2#include <string.h> 3 4int main() { 5 char buf [100]; 6 char tmp [3][100]; 7 8 int count=0; 9 while (fgets(buf, sizeof(buf), stdin) != NULL) { 10 strcpy(tmp[count], buf); 11 count +=1; 12 } 13 14 for (int i=0; i<3; i++){ 15 printf("%s",tmp[i]); 16 } 17 18 return 0; 19}

投稿2018/10/24 15:28

moonphase

総合スコア6621

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

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

Cchan

2018/10/24 15:32

たびたびすいません。 なぜ=ではいけないのでしょうか・・・
moonphase

2018/10/24 15:35

=演算子はint型などであればその値をコピーしますが、 文字列を扱う文字列変数で=演算子を使うとアドレスがコピーされます。 アドレスがコピーされると、常にchar buf [100];の先頭アドレスがコピーされるだけなので、意味がありません。 C言語では文字列はstrcpyを使ってコピーする必要があります。
yumetodo

2018/10/24 15:36

型が違います。tmp[count]した結果はchar[100]型でchar*を代入することはできません。配列の各要素を代入する必要があり、それを行っているのがstrcpyです。
moonphase

2018/10/24 15:50

確かに型違いですね。 アドレスとポインタが理解できるまではあまり深く考えず、C言語で文字列の代入はできないので迷わずstrcpy使いましょう。 私もアドレスとポインタは最初まったく理解できなかったので何度かハマってるうちにいつか理解できますよ。
Cchan

2018/10/24 16:06

なるほど有難うございます!!
yumetodo

2018/10/25 05:27

なお多くの場合strcpyよりmemcpyのほうが適当です(大体文字列の長さは既知なので
guest

0

3行以上入力するとまた最初に戻って上書きしてしまいますが、そんでいいんでしょうか


って、同じバッファのアドレスをその都度書いてるだけなので、全部最後に入力した文字列で埋まってしまいますねー
入力文字列を置いとくバッファを用意してそこにためていく必要がありますな

投稿2018/10/24 15:08

編集2018/10/24 15:11
y_waiwai

総合スコア87747

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

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

Cchan

2018/10/24 15:22

char型の[100]の領域を持つ配列を3つ作ってそこに順番に入れることが出来ないかとかんがえたのですが、どのように実装したらよいでしょうか・・・
y_waiwai

2018/10/24 15:25

char *tmp [100]; のかわりに char tmp[3][100]; として、(あとは考えてみてくだされ)
Cchan

2018/10/24 15:27

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問