ページ 1 / 1
入力した文字列の出力について
Posted: 2016年10月30日(日) 12:33
by milk
学校の課題で、入力した文字列をそのまま画面に出力するプログラムを作成するという課題が出ました。
何度でも入力可能とし、"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;
}
Re: 入力した文字列の出力について
Posted: 2016年10月30日(日) 12:44
by みけCAT
条件の意味がよく分かりませんが、「改行文字→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;
}
Re: 入力した文字列の出力について
Posted: 2016年10月30日(日) 13:03
by milk
条件が分かりづらかったようで大変申し訳ありません。
条件その通りです…。
どうにもうまくいっていなかったので大変助かりました。
ありがとうございます!
Re: 入力した文字列の出力について
Posted: 2016年10月30日(日) 13:17
by かずま
やり方はいろいろあります。
コード:
#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: 入力した文字列の出力について
Posted: 2016年10月30日(日) 13:53
by かずま
かずま さんが書きました:やり方はいろいろあります。
早とちりしていました。行頭に単独の 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: 入力した文字列の出力について
Posted: 2016年10月30日(日) 15:13
by あんどーなつ
私もやってみましたが、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: 入力した文字列の出力について
Posted: 2016年10月30日(日) 16:15
by かずま
あんどーなつ さんが書きました:私もやってみましたが、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: 入力した文字列の出力について
Posted: 2016年10月30日(日) 20:08
by あんどーなつ
fgetsの欠点を知っている。
7行になってる。
sizeofの後に括弧を書かなくていいことを知っている。
生きてるのがつらい。