需要阅读所有内容,直到***出现:
输入:
Hey there
how are
you
***
输出:
Hey there
how are
you
本来会使用scanf("%[^***]s)
但不能一次读取所有行。
只有基本的C知识
答案 0 :(得分:1)
我这样做的方法是一次读取一行(使用fgets
而不是scanf这样的函数),然后查看上次读取的行是否等于***
。您可以使用strcmp
来执行此操作,但如果您因某些原因不允许使用strcmp,也可以手动执行此操作。
答案 1 :(得分:0)
要跳过一个,两个或四个或更多星号但停在三个星号上,您可以一次读取一个字符的输入流。移动数组以丢弃第一个字符,并将最新字符添加到结尾。然后在读取一个字符后,将输入数组与数组进行比较以匹配。要允许处理继续四个或更多星号,找到三个匹配的星号,读取另一个字符并使用ungetc
将字符放回到流中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main( void) {
char input[4] = "";
char match[4] = "***";
int result = 0;
int last = 0;
int prior = 0;
while ( ( result = fgetc ( stdin)) != EOF) {//read each character from stream
prior = input[0];//the fourth character back
if ( prior == '*') {
fputc ( prior, stdout);
}
//shift the array
input[0] = input[1];
input[1] = input[2];
input[2] = result;//add the new character
input[3] = '\0';
if ( !input[0] && result != '\n') {//until a character is shifted into input[0]
if ( result != '*') {
fputc ( result, stdout);
}
continue;
}
if ( strcmp ( input, match) == 0) {//the three characters match
if ( ( last = fgetc ( stdin)) != EOF) {//read another character
if ( last == '*') {//to skip more than three *
ungetc ( last, stdin);//put back into stream
}
else {
if ( prior != '*') {
break;
}
else {
ungetc ( last, stdin);
}
}
}
else {
fprintf ( stderr, "problem getting input\n");
return 1;
}
}
if ( result != '*') {
//print pending asterisks as needed
if ( input[0] == '*') {
fputc ( input[0], stdout);
input[0] = ' ';
}
if ( input[1] == '*') {
fputc ( input[1], stdout);
input[1] = ' ';
}
if ( input[2] == '*') {
fputc ( input[2], stdout);
input[2] = ' ';
}
fputc ( result, stdout);
}
}
fputc ( '\n', stdout);
return 0;
}