入力した文字列の出力について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
milk

入力した文字列の出力について

#1

投稿記事 by milk » 8年前

学校の課題で、入力した文字列をそのまま画面に出力するプログラムを作成するという課題が出ました。

何度でも入力可能とし、"q"を入力すると,文字表示せずに終了するようにすること。 このとき、"quiz" や "quit"などの文字を入力しても終了しないようにする。 という条件なのですが、どうしてもqを含むと終了してしまいます。

ご教授いただけると幸いです。
よろしくお願い致します。

コード:

 
#include<stdio.h>

int main(void)
{
	int ch;
	

	while ((ch = getchar()) != EOF)
	
		if (ch == 'q')
			break;

		else
			putchar(ch);

	putchar('\n');
	return 0;

}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 入力した文字列の出力について

#2

投稿記事 by みけCAT » 8年前

条件の意味がよく分かりませんが、「改行文字→q→改行文字」のパターンを見つけたら終了するということでしょうか?

コード:

#include<stdio.h>

int main(void)
{
	int ch;
	int q_flag = 0;
	int lf_flag = 0;

	while ((ch = getchar()) != EOF)
	{

		if (q_flag)
		{
			if (ch == '\n')
				break; /* \n→q→\nと来たので、終了する */

			else
			{
				q_flag = 0; /* qの直後に改行文字が来なかったので、通常の状態に戻す */
				putchar('q'); /* 出力抑制していたqを出力する */
				putchar(ch); /* 今来た文字を出力する */
			}
		}
		else if (lf_flag)
		{
			if (ch == 'q') /* \n→qと来た */
				q_flag = 1; /* qは出力せず、qが来たフラグを立てる */

			else
				putchar(ch); /* q以外の文字は出力する */

			if (ch != '\n') /* 直前の文字が\nではないので、フラグを折る */
				lf_flag = 0;
		}
		else
		{
			if (ch == '\n') /* \nが来たので、フラグを立てる */
				lf_flag = 1;

			putchar(ch); /* 文字は常に出力する */
		}
	}

	putchar('\n');
	return 0;

}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

milk

Re: 入力した文字列の出力について

#3

投稿記事 by milk » 8年前

条件が分かりづらかったようで大変申し訳ありません。

条件その通りです…。 
どうにもうまくいっていなかったので大変助かりました。
ありがとうございます!

かずま

Re: 入力した文字列の出力について

#4

投稿記事 by かずま » 8年前

やり方はいろいろあります。

コード:

#include <stdio.h>

int main(void)
{
    int ch = getchar();
    while (ch != EOF)
        if (ch == 'q') {
            ch = getchar();
            if (ch == '\n') break;
            putchar('q');
        }
        else {
            putchar(ch);
            ch = getchar();
        }
    return 0;
}

かずま

Re: 入力した文字列の出力について

#5

投稿記事 by かずま » 8年前

かずま さんが書きました:やり方はいろいろあります。
早とちりしていました。行頭に単独の q があるときだけ終了するのですね。

コード:

#include <stdio.h>

int main(void)
{
    int ch = getchar(), bol = 1;  // beginning of line
    while (ch != EOF)
        if (bol && ch == 'q') {
            ch = getchar();
            if (ch == '\n') break;
            bol = 0;
            putchar('q');
        }
        else {
            putchar(ch);
            bol = ch == '\n';
            ch = getchar();
        }
    return 0;
}

あんどーなつ

Re: 入力した文字列の出力について

#6

投稿記事 by あんどーなつ » 8年前

私もやってみましたが、2行しか削れませんでした。

コード:

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

#define MAXLEN 256

int main() {
  char str[MAXLEN+1];
  while (fgets(str, MAXLEN, stdin)) {
    int i = strlen(str);
    if (i >= 1 && str[i-1] == '\n')
      str[i-1] = '\0';
    if (strcmp(str, "q") == 0)
      break;
    puts(str);
  }
  return 0;
}

かずま

Re: 入力した文字列の出力について

#7

投稿記事 by かずま » 8年前

あんどーなつ さんが書きました:私もやってみましたが、2行しか削れませんでした。
fgets を使うと、行の長さが制限されるという問題がありますが、短くはなります。

コード:

#include <stdio.h>
 
int main(void) {
    char s[256];
    while (fgets(s, sizeof s, stdin) && strcmp(s, "q\n")) fputs(s, stdout);
    return 0;
}
256文字入力して、最後の文字が q の場合、終了してしまいます。

あんどーなつ

Re: 入力した文字列の出力について

#8

投稿記事 by あんどーなつ » 8年前

fgetsの欠点を知っている。
7行になってる。
sizeofの後に括弧を書かなくていいことを知っている。
生きてるのがつらい。

閉鎖

“C言語何でも質問掲示板” へ戻る