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

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

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

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

Q&A

解決済

3回答

775閲覧

二つ以上のスペースを省略するプログラムの理屈が分かりません

shal

総合スコア1

C

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

0グッド

0クリップ

投稿2020/05/06 15:26

編集2020/05/06 15:47

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

該当のソースコード

#include <stdio.h>

int main(void){

int c, buf; while ((c = getchar()) != EOF){ if (c == ' '){ buf = ' '; } else{ if (buf == ' '){ putchar(buf); buf = '\0'; } putchar(c); } }

}

ソースコード

試したこと

ここに問題に対して試したことを記載してください。
プログラムは正常に作動しました

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

ご指摘ありがとうございます。
このプログラムでは例えばA B Cと入力したときにA B Cと印字されることを目的とし、実際に正しく動作しました。しかし、プログラムがどう実行されてこの結果になったのか、\0は何のために置いたのかが理解できずに質問させていただきました。プログラムの勉強を始めたのはつい最近のことなので質問の的を射ていないと思いますが、その時はまた補足させていただきます。
ここにより詳細な情報を記載してください。

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

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

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

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

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

tiitoi

2020/05/06 15:33

> 二つ以上のスペースを省略する プログラムに対して、どういう挙動を期待していて、実際はどうなったのか、質問欄を編集して、もう少し詳しく説明していただけますか
shal

2020/05/06 15:48

一応は補足させていただきました。 足りないところがあればまた補足します。よろしくお願いします!
guest

回答3

0

ベストアンサー

変数名と変数の役割が不明瞭なので、ロジックそのままで書き直してみました。

C

1#include <stdio.h> 2 3#define TRUE 1 4#define FALSE 0 5 6int main(void){ 7 int c, readling_spaces; 8 9 readling_spaces = FALSE; 10 while ((c = getchar()) != EOF){ 11 if (c == ' '){ 12 readling_spaces = TRUE; 13 }else{ 14 if(readling_spaces){ 15 readling_spaces = FALSE; 16 putchar(' '); 17 } 18 putchar(c); 19 } 20 } 21}

これでわかるでしょうか?
微妙なバグがありますが、そのまま残してます。

投稿2020/05/06 15:48

otn

総合スコア85901

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

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

shal

2020/05/06 16:03

迅速な対応ありがとうございました。 熟練度の差がありすぎて理解に時間がかかりましたが、とても参考になりました。
guest

0

読み込んだ文字を出力する条件を考えてみましょう。

・読み込んだ文字がスペースでなければ、 そのまま出力する。 ・読み込んだ文字がスペースだったら、 直前に出力したのがスペースでなければ、 そのまま出力する。 直前に出力したのがスペースだったら、 何もしない。

直前に出力した文字は、putchar の返却値です。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int c, prev = EOF; 6 while ((c = getchar()) != EOF) 7 if (c != ' ' || prev != ' ') 8 prev = putchar(c); 9}

投稿2020/05/07 00:09

kazuma-s

総合スコア8224

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

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

0

x1.c

c

1#include <stdio.h> 2#include <stdbool.h> 3#include <ctype.h> 4 5#define SPACE ('.') 6 7int main(void) { 8 setvbuf(stdin, NULL, _IONBF, 0); 9 10 int leading_blank = false; 11 int ch; 12 while ((ch = getchar()) != EOF) { 13 if (isspace(ch)) { 14 leading_blank = true; 15 } else { 16 if (leading_blank) { 17 putchar(SPACE); 18 leading_blank = false; 19 } 20 putchar(ch); 21 } 22 } 23}

実行例:
イメージ説明

改行コードやTABコードも スペースコードと同じようにあつかうようにしてみました。
cat -e 1.txt では、ファイル中の改行コードの位置がわかります。 ($ で改行コード位置が表示されます)

プログラムでは 区切り文字の出力がわかりやすいように "." で出力しています。
1.txt を このプログラムで処理させると、行の末尾にあるスペースも出力省略できていることがわかります。

setvbuf は キーボードからデータを入力しているときのためのものです。
キー入力時に ENTER キー を押すまえに Ctrl-D を押したときの挙動が異なってきます。
setvbuf の行をコメントアウトしたときと、そうでないときとで どんな挙動の差があるかを確認してみてください。

参考情報;

  • 入出力用のバッファ (buffer) を設定します.

http://www.c-tipsref.com/reference/stdio/setvbuf.html

投稿2020/05/06 23:39

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問