Как правильно считать слова, используя strtok? - PullRequest
0 голосов
/ 27 ноября 2018
#include <stdio.h>
#include <string.h>

int main(void) {

  char tekst[10000], test=0;
  char* word;
  char word_copy[100][100];
  int i=0, lenght=0;

  printf("Type in your text: ");
  fgets(tekst, 10000, stdin);

  lenght=strlen(tekst)-1;
  if(lenght>1000)
  {
    lenght=1000;
  }

  word=strtok(tekst, " ,\".-");

  while( word != NULL)
    {
      word=strtok(NULL, " ,\".-");
      printf("%s ", word);
      i++;

    }

  printf("%d", i);

Привет.Что я хочу сделать, так это считать слова только с помощью strtok.Однако, если я наберу: «пример» или -example-, я получу ответ «2» вместо «1».По какой-то причине, когда последнее слово (ноль), оно все еще запускает цикл, и i ++ работает ... Я довольно новичок в программировании, поэтому я бы с удовольствием записал правильный код.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

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

...
char *text = tekst;
while((word = strtok(text, " ,\".-"))) {
    text = NULL;
    printf("%s ", word);
    i++;
}
...
0 голосов
/ 27 ноября 2018

Вы хотите удалить завершающий символ новой строки fgets(), как упомянуто в Удаление завершающего символа новой строки из ввода fgets () .

Затем я удалил неиспользуемые элементы вашегокод, например длина.

Как упоминается в примере из strtok() reference , вы сначала берете токен, а затем снова вызываете функцию.При таком подходе вам не нужно беспокоиться о подсчете NULL как слова (что и сделал ваш код).

Собрав все воедино, мы получим:

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

int main(void) {

  char tekst[10000];
  char* word;
  int i=0;

  printf("Type in your text: ");
  fgets(tekst, 10000, stdin);
  tekst[strcspn(tekst, "\n")] = 0;

  word=strtok(tekst, " ,\".-");

  while( word != NULL)
  {
      printf("%s ", word);
      word=strtok(NULL, " ,\".-");
      i++;

  }

  printf("%d", i);

  return 0;
}

Вывод (Ввод: «переполнение стека»):

Введите текст: переполнение стека 2


PS: strlen() возвратдлина строки без нулевого терминатора, не нужно самостоятельно вычитать.

...