@witalianno

Как реализовать корректный поиск строк на С?

Суть вопроса такова. Результатом работы представленной программы является поиск строк, в которых содержится ключевое слово и вывод их на экран после ввода. То есть должно получиться что-то вроде следующего:

По образцу "ould" из текста

Ah Love! could you and I with Fate conspire
To grasp this sorry Scheme of Things entire,
Would not we shatter it to bits — and then
Re-mould it nearer to the Heart's Desire!


должны быть выбраны строки

Ah Love! could you and I with Fate conspire
Would not we shatter it to bits — and then
Re-mould it nearer to the Heart's Desire!


Но проблема состоит в том, что вывод происходит сразу после обнаружения первой такой строки, а не после конца ввода всего текста.

Помогите пожалуйста разобраться с тем, как организовать вывод обнаруженных строк именно после окончания ввода - допустим после двойного \n.

Спасибо.

#include <stdio.h>
 
#define MAXLINE 1000 /* максимальный размер вводимой строки */
 
int getline(char line[], int max);
 
int strindex(char source[], char searchfor[]);
 
 
char pattern[] = "ould"; /* образец для поиска (литерал) */ 
 
/* найти все строки, содержащие образец */
 
 int main(void)
 
{
    char line[MAXLINE];
    int found = 0;
 
 
    while (getline(line, MAXLINE) > 0)
 
        if (strindex(line, pattern) >= 0){
            printf ("%s\n", line);
            found++;
        }
 
    return found; 
}
 
/* getline: читает строку в s, возвращает длину */
 
int getline(char s[], int lim)
{
    int c, i;
    
    
    for (i = 0; i < lim && (c = getchar()) != EOF && c != '\n'; i++){
 
        s[i] = c;
    }
 
    if (c == '\n') s[i] = c;
 
    s[i] = '\0';
            
    return i;
}
 
/* strindex: вычисляет место t в s или выдает -1, если t нет в s */
 
int strindex(char s[], char t[])
{
    int i, j, k;
    for (i = 0; s[i] != '\0'; i++) {
        for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
            ;
        if (k > 0 && t[k] == '\0')
            return i;
    }
    return -1;
}
  • Вопрос задан
  • 198 просмотров
Пригласить эксперта
Ответы на вопрос 3
уберите принт и сохраняйте найденные строки
Ответ написан
NeoCode
@NeoCode
C/C++ programmer
Если это чистый Си и нет возможностью воспользоваться stl-ными контейнерами, то объявите вместо одномерного массива (для одной строки) двухмерный (для нескольких строк).
Затем сначала сделайте цикл чтения строк в него - без вывода
А затем следующий цикл - по количеству прочитанных строк - обработка и вывод
Ответ написан
@abcd0x00
Помогите пожалуйста разобраться с тем, как организовать вывод обнаруженных строк именно после окончания ввода - допустим после двойного \n.

Надо скомилировать программу, а потом ей на вход подать весь текст по каналу.
В лине:
cat file.txt | ./prog
В винде:
type file.txt | prog.exe
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы