使用 strtok 分组错误标记拆分字符串
Split a String using strtok groups false tokens
我正在尝试逐行读取文本文件并将每一行拆分为一个标记。但是当我尝试解析
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 s”,第三个是 0,没有第四个标记。
我添加了一个例子
#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] = '[=13=]';
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);
}
您对 strtok
的第二次调用使用了错误的参数。
而不是
token = strtok(NULL, line);
写
token = strtok(NULL, " ");
如果您使用 line
作为定界符的参数,则第二次调用将从 line
开始,从 :
开始,这样 strtok
将拆分为 :
首先(而不是像您预期的那样在
上)。
我正在尝试逐行读取文本文件并将每一行拆分为一个标记。但是当我尝试解析
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 s”,第三个是 0,没有第四个标记。
我添加了一个例子
#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] = '[=13=]';
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);
}
您对 strtok
的第二次调用使用了错误的参数。
而不是
token = strtok(NULL, line);
写
token = strtok(NULL, " ");
如果您使用 line
作为定界符的参数,则第二次调用将从 line
开始,从 :
开始,这样 strtok
将拆分为 :
首先(而不是像您预期的那样在 上)。