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

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

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

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

Q&A

解決済

5回答

1635閲覧

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

Cchan

総合スコア35

C

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

0グッド

0クリップ

投稿2018/10/23 19:56

編集2018/10/23 19:58

char型の配列3つに文章1行ずつ終端までループで順番に上書きするプログラムを作りたいのですが、以下のプログラムのコメントアウトの部分で(core dump)が起きてしまいます。
よく理解していないのですが、fgetsによってbufに書き込まれるものは文字列ではなくintなのでしょうか。
何が書き込まれているのかよくわかりません・・・。なので何が起きているのか理解できませんでした。

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

C

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

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

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

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

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

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

guest

回答5

0

ベストアンサー

修正方法としては、set0gut1さんの指摘どおりだと思いますが、、、

C言語の文字列と、文字の扱いが混乱していると思います。
(とりあえず、全角文字は置く、、Ascii文字のみとする)

char tmp [100]; --> これは、100文字分の領域を tmp と言う名前で用意する。

tmp[count%3]=buf; --> tmpで用意された領域の(count%3)番目(の文字)を buff (これは、文字列 --> 文字列の先頭アドレス) にする。
--> 文字列のアドレスは、64bit(64bit環境の場合)なので、文字サイズ(8bit)に切り詰めて格納する。

printf("%s",tmp[i]); --> tmp[i]を文字列と見なして("%s")、出力する。
--> tmp[i] は、文字(8bit)。これを文字列(文字列の先頭アドレス)に見なして参照する。
--> 8bitのアドレスは、通常使われない(実際には、8bit --> 64bitに変換)ので、エラーとなる。

と言う事になりますが、分かるでしょうか?

投稿2018/10/24 12:18

pepperleaf

総合スコア6383

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

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

0

1.「char型の配列3つに・・」とありますが2つしかないですし、宣言もおかしいのでは?
2.ソースだとbuf の中をコピー(保存)して表示したいようですが、fgets はbuf を上書きするので、ポインタを保存しようとしても意味ないのでは?

c

1#include<stdio.h> 2#include<string.h> 3 4int main(){ 5 char buf [100]; 6 char tmp [3][100]; // 3つの配列 7 // tmp[2]; // コメントアウト 8 9 int count=0; 10 while(fgets(buf,sizeof(buf),stdin)!=NULL){ 11 // tmp[count%3]=buf; // コメントアウト 12 strcpy(tmp[count%3], buf); // 中身をコピー 13 count +=1; 14 } 15 16 for(int i=0;i<3;i++){ 17 printf("%s",tmp[i]);// エラー部分 %dにてintが表示 18 } 19 20 return 0; 21}

投稿2018/10/24 02:02

miyakichi

総合スコア297

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

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

0

どういったことがしたいのかを置いておいて、とりあえずプログラムがおかしいところをコメントで書いておきました

c

1#include<stdio.h> 2 3int main(){ 4 5char buf [100]; 6char tmp [100]; 7tmp[2]; // いらなくない?何がしたいのかわかりません。 8 9int count=0; 10while(fgets(buf,sizeof(buf),stdin)!=NULL){ 11 12tmp[count%3]=buf; // tmp[i]は要素、要素に文字列(文字型配列先頭へのアドレス)つっこむのおかしい 13 14 15 count +=1; 16} 17 18for(int i=0;i<3;i++){ 19 20 printf("%s",tmp[i]);// %sは文字列を表示します。 tmp[i]はcharなので"%c"とすべき 21 22} 23 24return 0; 25}

投稿2018/10/24 01:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

fgetsによってbufに書き込まれるものは文字列ではなくintなのでしょうか。

fgets()のあとにputs()でも入れれば確認できます、

ちょっと難しくなってますが、以下参照d^^

c

1usr~/test/c % ./t 2123456779 ←入力 3123456779 ←出力(改行が2回入るのはfgets()で読み込んだ改行とputs()が出力する改行のため) 4 5abcdef ←入力 6abcdef 7 8aaabbbcccddd ←入力 9aaabbbcccddd 10 11123456779 12abcdef 13aaabbbcccddd 14usr~/test/c % cat t.c 15#include <stdio.h> 16#include <stdlib.h> 17#include <string.h> 18 19int main() 20{ 21 22 char buf[100]; 23 char *tmp[100]; 24// tmp[2]; 25 26 int count = 0; 27 while (fgets(buf, sizeof(buf), stdin) != NULL) { 28 puts(buf); 29 tmp[count] = malloc(strlen(buf)+1); 30 strcpy(tmp[count],buf); 31 count++; 32/* もし指定回数で止めたければコメントを外して下さい 33 if(3 == count){ 34 break; 35 } 36*/ 37 } 38 39 for (int i = 0; i < count; i++) { 40 printf("%s", tmp[i]); // エラー部分 %dにてintが表示 41 free(tmp[i]); 42 } 43 44 return 0; 45} 46usr~/test/c % 47

投稿2018/10/23 21:31

編集2018/10/23 21:49
cateye

総合スコア6851

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

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

cateye

2018/10/23 21:33

4回めの入力待ちにCtl+D入れてます。
guest

0

buf は char 配列(= 文字列)の先頭を指すポインタですが、
これを char 配列 tmp に突っ込んだときにキャストが起こってます。
僕の手元でやると 0x7ffee3fc744064 に切り詰められました。
で printf の %s が 64 を読もうとして segmentation fault という流れですね。

char tmp [100];char* tmp [100]; にすると直ります。


追記

tmp[i]buf を何回か入れてますが、 buf は毎回同じ値です。
つまり出力するとき、最後に読み込んだ文字列が複数回出力されます。
これはまた別のバグなので頑張ってくださいbb

投稿2018/10/23 20:30

編集2018/10/24 15:35
set0gut1

総合スコア2413

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

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

Cchan

2018/10/24 14:38

ありがとうございます。 たしかに最後に読み込んだ文字列が複数回出力されます・・・ よければ教えていただけますと幸いです
set0gut1

2018/10/24 15:31

回答に追記しました!
set0gut1

2018/10/24 15:35

新しく質問を立てられたようなのでそちらに記入しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問