Можете ли вы разобрать предложения с помощью `scanf` и обнаружить новые строки? - PullRequest
0 голосов
/ 10 сентября 2011

Я знаю, как scanf можно использовать для разбора предложений в отдельные слова:

while(1){
    scanf("%s", buffer)
    ...
}

Однако, если я введу предложение типа one two three<return>, как я могу узнать внутри цикла whileесли слово, которое я получаю в буфере, - это то, что было до того, как я нажал <return>?

Я думаю, это вряд ли возможно с scanf, но, возможно, есть подобная функция?

Ответы [ 2 ]

2 голосов
/ 10 сентября 2011

Вы должны использовать fgets(), чтобы прочитать всю строку и разобрать ее следующим образом:

char buffer[BUFSIZE] = {};        // BUFSIZE should be large enough for one line
fgets(buffer, BUFSIZE, stdin);    // read from standard input, same as scanf
char *ptr = strtok(buffer, " ");  // second argument is a string of delimiters
                                  // can be " ,." etc.
while (ptr != NULL) {
    printf("Word: '%s'\n", ptr);

    ptr = strtok(NULL, " ");      // note the NULL
}

Проверка, является ли текущее слово последним словом, тривиальна:

while (ptr != NULL) {
    char word[BUFSIZE] = {};
    strcpy(word, ptr);         // strtok clobbers the string it is parsing
                               // So we copy current string somewhere else.
    ptr = strtok(NULL, " ");

    bool is_last_word = (ptr == NULL);
    // do your thing here with word[]
}
0 голосов
/ 12 сентября 2011

Если вас интересует только последнее слово, вы можете сделать это самостоятельно достаточно легко. Представленные решения fgets () подвержены усложнению, если строки превышают размер буфера - вы можете разделить слово на несколько вызовов fgets (). Вы должны быть готовы справиться с такой возможностью.

scanf () сам по себе опасен - он будет читать слова произвольной длины в ваш буфер. Не забывайте использовать% s со спецификатором длины, если вы полагаетесь на него. Я уверен, что на самом деле вы не можете использовать scanf () для достижения того, что вам нужно.

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

...