2015-11-16 2 views
0

У меня есть простой C-код для чтения файла. Прочитайте ввод строки за строкой. Обозначьте линию и распечатайте текущий токен. Моя проблема в том, что я хочу напечатать следующий токен, если выполняются некоторые условия. Вы не знаете, как это сделать. Мне действительно нужна ваша помощь для этого проекта. Спасибо Вот код:Доступ к следующему слову/строке

main(){ 

FILE *input; 
FILE *output; 
//char filename[100]; 

const char *filename = "sample1.txt"; 
input=fopen(filename,"r"); 
output=fopen("test.st","w"); 
char word[1000]; 
char *token; 
int num =0; 
char var[100]; 

fprintf(output,"LEXEME, TOKEN"); 
while(fgets(word, 1000, input) != NULL){ //reads a line 

token = strtok(word, " \t\n"); // tokenize the line  
while(token!=NULL){ // while line is not equal to null 
    fprintf(output,"\n"); 
    if (strcmp(token,"SIOL")==0) 
     fprintf(output,"SIOL, SIOL", token); 
    else if (strcmp(token,"DEFINE")==0) 
     fprintf(output,"DEFINE, DEFINE", token); 
    else if (strcmp(token,"INTEGER")==0){ 
     fprintf(output,"INTEGER, INTEGER"); 
     strcpy(var,token+1); 
     fprintf(output,"\n%s,Ident",var); 
    } 
    else{ 
     printf("%s\n", token); 
    }  
    token = strtok(NULL, " \t\n"); //tokenize the word  
}}fclose(output);return 0;} 
+1

Вы пробовали 'strtok'? – artm

+0

'strtok' - хороший вариант, но если вы правильно поняли, что хотите напечатать или не распечатать следующий на основе некоторого условия с текущим, то если вы разбираете строку в последовательном порядке, почему бы просто не пропустить в следующее пространство или новую строку в случае «без печати». Чтобы получить более подробную информацию, вам нужно будет отправить дополнительную информацию. Не зная, что вы сейчас делаете, резко ограничивает помощь, которую вы можете получить. –

+0

да, это то, что я использовал для обозначения линии. Я могу распечатать текущий токен. Мне нужно распечатать следующий или предстоящий токен, если какое-то условие выполнено. Например, строка «Быстрая коричневая лиса» Текущий токен «The». Если (strcmp («The», «The») == 0) printf («быстрый»). –

ответ

0

Продолжая мой комментарий. Я не уверен, я полностью понимаю, что вам нужно, но если у вас есть строка:

"The quick brown fox"; 

И вы хотите разметить строку, печать следующий слово, только если условие относительно тока слово выполнено, тогда вам нужно немного изменить свое мышление. В вашем примере вы хотите напечатать следующее слово "quick", только если настоящее слово - "The".

Корректировка в мышлении - это то, как вы смотрите на тест. Вместо того чтобы думать о печати следующего слово, если ток соответствует некоторому условию, необходимо сохранить последнее слова, и только распечатать текущего если последнего слово соответствует некоторому условию - "The" в вашем пример.

Чтобы справиться с этой ситуацией, вы можете использовать статически объявленный массив символов не менее 47 символов (самое длинное слово в Merriam-Websters Unabridged Dictionary - 46 символов). Я буду использовать 48 в приведенном ниже примере. У вас может возникнуть соблазн просто сохранить указатель на последнее слово, но при использовании strtok нет гарантии, что адрес памяти, возвращенный предыдущей итерацией, будет сохранен - ​​так что сделайте копию слова.

Соединяя кусочки, вы можете сделать что-то вроде следующего. Он сохраняет предшествующий маркер в last, а затем сравнивает текущее слово последним и выводит текущее слово, если last == "The":

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAXW 48 

int main (void) { 

    char str[] = "The quick brown fox"; 
    char last[MAXW] = {0}; 
    char *p; 

    for (p = strtok (str, " "); p; p = strtok (NULL, " ")) 
    { 
     if (*last && strcmp (last, "The") == 0) 
      printf (" '%s'\n", p); 
     strncpy (last, p, MAXW); 
    } 

    return 0; 
} 

Выход

$ ./bin/str_chk_last 
'quick' 

Позвольте мне знать, если у вас есть какие-либо вопросы.


Тест Объяснение

Как написано в комментарии *last просто сокращание last[0]. Итак, первая часть теста, *last, просто тестирует if ((last[0] != 0) && ... Так как в прошлом изначально был объявлен и инициализирован:

char last[MAXW] = {0}; 

Все символы в last являются 0 для первого прохода через петлю. Включив проверку last[0] != 0, это просто приводит к тому, что printf пропускается при первом запуске цикла for. Обыкновенное письмо для теста будет выглядеть так:

if ((last[0] != 0) && strcmp (last, "The") == 0) 
     printf (" '%s'\n", p); 

Который в псевдокоде просто говорит:

if (NOT first iteration && last == "The") 
     printf (" '%s'\n", p); 

Позвольте мне знать, если это не имеет смысла.

+0

Я получил вашу точку зрения г-н @ Дэвид. Я попытаюсь использовать его, и я дам вам знать, если это сработает. Большое вам спасибо за ответ. Кстати, у вас есть вопрос. –

+0

if (* last && strcmp (last, "The") == 0) Интересно, что означает значение * last в этом утверждении –

+0

Извините, это просто сокращение от 'last [0]'. Это всего лишь проверка, что первый символ в строке не '' \ 0''. (который является числовым «0» - иначе известен как символ «нуль-завершающий»). Подумайте об этом так. в указателе нотации 'array [0]' is '* (array + 0)', '+ 0' ничего не делает, поэтому' * array' является просто ярлыком для 'array [0]' и тестом в full is '((array [0]! = '\ 0') && ... Все это означает, что он просто пропускает первую итерацию, потому что' * array' является NULL, а затем инициализацией (например, 'char last [MAXW] = {0}; ') Надеюсь, что это объяснит. –

0

Легко достичь с помощью strtok функции. Обратите внимание, что если вы поместите нулевой указатель в качестве первого аргумента, функция продолжит сканирование той же строки, где завершился предыдущий успешный вызов функции. Так что если вам нужно лексема просто позвонить

char* token = strtok(NULL, delimeters); 

Смотрите небольшой пример ниже

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char str[] = "The quick brown fox"; 

    // split str by space 
    char* token = strtok(str, " "); 

    // if a token is found 
    if(token != NULL) { 
     // print current token 
     printf("%s\n", token); 
     // if token is "The" 
     if(strcmp(token, "The") == 0) { 
      // print next token 
      printf("%s\n", strtok(NULL, " ")); 
     } 
    } 
    return 0; 
} 

Выход будет

The 
quick 
Смежные вопросы