Split a String используя ложные токены групп strtok - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь читать текстовый файл построчно и разбивать каждую строку на токен. Но когда я пытаюсь разобрать

D: 0 S: 0
push 0
prti
halt

Я получаю сообщение об ошибке в первой строке. Результат

0: [D:] [0 S] [0] (3 Token)
1: [push] [0] (2 Token)
2: [prti] (1 Token)
3: [halt] (1 Token)

но я ожидал

0: [D:] [0] [S:] [0] (4 Token) <--
1: [push] [0] (2 Token)
2: [prti] (1 Token)
3: [halt] (1 Token)

второй токен должен быть 0, а третий должен быть S: но, как вы можете видеть в первом результате, второй токен равен «0 с», третий - 0 и 4-го токена нет.

Я добавил пример

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

char *trimwhitespace(char *str) {
  char *end;
  while(isspace((unsigned char)*str)) str++;
  if(*str == 0) return str; 
  end = str + strlen(str) - 1;
  while(end > str && isspace((unsigned char)*end)) end--;
  end[1] = '\0';
  return str;
}

int main(void) {

    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;

    int tokencounter = 0;
    char *token;
    int linecounter;
    int address = 0;

    char *tokentemp;

    fp = fopen("test.asm", "r");
    if (fp == NULL) exit(1);

    while ((read = getline(&line, &len, fp)) != -1) {   

        token = strtok(line, " ");
        tokencounter = 0;

        printf("%d: ", linecounter);

        while( token != NULL ) {

            token = trim( token );
            printf( "[%s] ", token );
            tokencounter++;                
            token = strtok(NULL, line);           

        }

        printf("(%d Token)\n", tokencounter);

        linecounter++;

    }

    fclose(fp);
    if (line) free(line);
    exit(1);

}

1 Ответ

0 голосов
/ 15 января 2019

Ваш второй вызов strtok использует неверные аргументы.

Вместо

token = strtok(NULL, line);

написать

token = strtok(NULL, " ");

Если вы используете line в качестве параметра для разделителя, то второй вызов начнется с line, начинающегося с :, так что strtok будет разделен на : первым (а не на ) как вы и ожидали).

...