Попытка подсчитать количество токенов, созданных strtok () в C - PullRequest
0 голосов
/ 28 сентября 2018

В настоящее время я реализую программу, в которой пользовательский ввод нажимает со значением или всплывает со значением.Чтобы разделить токены, я использую strtok().Все случаи в моей программе работают нормально, кроме случаев, когда пользователь вводит три значения: например, правильный допустимый ввод будет «push 5» или «pop».Например, когда пользователь должен ввести: «push 5 7», я хочу подсчитать, что есть 3 токена, и поэтому отклонить ввод.Программа через аргумент командной строки спрашивает, сколько строк пользователь введет через STDIN, и, следовательно, у меня есть цикл for.С моим текущим счетчиком он всегда возвращает правильное количество токенов в первом цикле, но каждый цикл после него возвращает 0.

int main(int argc, char *argv[]){
    int numlines = atoi(argv[1]);

    for(int i = 1; i<= numlines; i++){
       char str[256];
       fgets(str,256,stdin);

       str[strcspn(str, "\n")] = 0;

       char *tmp;
       char *token;
       char *tmp2;
       int count; //This is the counter for the tokens
       tmp = strtok(str," ");
       while(token != NULL){
          tmp2 = token;
          token = strtok(NULL, " ");
          count++;
   }
   printf("%d\n", count);
}

Внизу есть еще код, который манипулирует токенами tmp и tmp2, но работает нормально.Опять же, счетчик работает для первого прохода, но всегда возвращает 0 после.Спасибо за помощь, ребята.

1 Ответ

0 голосов
/ 28 сентября 2018

count объявляется в цикле for, поэтому после его завершения он не попадает в область видимости.Вам необходимо объявить его перед циклом, а также инициализировать его как 0.

Кроме того, вы должны присвоить результат первого strtok() для token.В противном случае вы тестируете неинициализированную переменную в первый раз в цикле.

Я не уверен, для чего нужны tmp и tmp2, так как вы никогда не используете их;Я думаю, что они для кода, который вы еще не добавили, поэтому я оставил их.

int main(int argc, char *argv[]){
    int numlines = atoi(argv[1]);

    int count = 0; //This is the counter for the tokens

    for(int i = 1; i<= numlines; i++){
        char str[256];
        fgets(str,256,stdin);

        str[strcspn(str, "\n")] = 0;

        char *tmp;
        char *token;
        char *tmp2;
        tmp = token = strtok(str," ");
        while(token != NULL){
            tmp2 = token;
            token = strtok(NULL, " ");
            count++;
        }
    }
    printf("%d\n", count);
}
...