Заменить заполнители с текстом - C? - PullRequest
2 голосов
/ 14 ноября 2009

Я использую приведенную ниже функцию для извлечения символов один за другим из потока FILE. Теперь текст в этом файле будет иногда содержать такие места, как! First_name! в тексте. Как лучше всего определить, когда начинается такой заполнитель и когда он заканчивается, чтобы я мог поменять местами каждый символ !! с правильным характером из другого хранилища?

void print_chars(FILE *file) {
        fseek(file, 0L, 0);
        int cr;

        do {
              cr = fgetc(file);
              putchar(cr);
        } while (cr != EOF);
}

Ответы [ 4 ]

5 голосов
/ 14 ноября 2009

Начните с использования fgets() для чтения строк за раз, а затем (при условии, что в заполнителях не будет пробелов или новых строк), используйте strchr(), чтобы найти первый восклицательный знак, другой - для поиска второго и strcpsn() или strspn(), чтобы между ними отображались только разрешенные символы. Затем напишите, что идет перед первым восклицательным знаком и замещающим текстом, и затем возобновите сканирование на наличие дополнительных заполнителей в той же строке.

1 голос
/ 14 ноября 2009

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

1 голос
/ 14 ноября 2009

Вы также можете использовать более примитивный подход, читая его по 1 символу за раз, а затем прерывая, если char == '!' и затем создайте строку, пока другой '!' а затем просто сравните эту строку с вашим списком замен ..

@ ответ Го Чтобы сказать, нажмите чар .. вот код

<code>
//c is char read from file
if(c=='!'){
  char str[100];
  c=fgetc
  int i=0;
  while(c!='!'){
    str[i]=c;
    i++;
    c=fgetc
  }
  i++;
  str[i]='\0'; //null terminate
  if(strcmp(str,"....")... //continue... 
}
1 голос
/ 14 ноября 2009

Построить конечный автомат, он же конечный автомат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...