如何读取字符串中的多行直到C中的指定字符

时间:2016-11-23 14:20:27

标签: c string

需要阅读所有内容,直到***出现:

输入:

Hey there
how are
you
***

输出:

Hey there
how are
you

本来会使用scanf("%[^***]s)但不能一次读取所有行。 只有基本的C知识

2 个答案:

答案 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;
}