我有一个文本文件,我试图用strtok来分隔数据。文本文件如下所示。
SET,SDI,1,Test1
SET,SDI,2,Test 2
SET,SDI,3,Test Test 3
SET,SDI,4, Test 4
SET,SDI,5,Test 5
我的strtok代码一直有效,直到将空格引入第4个值(“Test x”)。即使我特意将我的分离字符定义为逗号(“,”)。 这是输出。
printf("%s, %s, %s, %s\n", values[0], values[1], values[2], values[3]);
SET, SDI, 1, Test1
SET, SDI, 2, Test
SET, SDI, 3, Test
SET, SDI, 4, Test
SET, SDI, 5, Test
有没有办法让strtok将第4个值识别为一个值,而不是在空格后丢失数据?
这是我的strtok代码:
void openfile(char *file_name){
FILE *file;
char line[100];
char sep_char[] = ",";
char* token;
char var[20];
char values[10][20];
int i;
file = fopen(file_name, "r");
if (file != NULL) {
while (fgets(line, 100, file) != NULL) {
i = 0;
token = strtok(line, sep_char);
while (token != NULL) {
sscanf (token, "%s", &var);
strcpy(values[i++], var);
token = strtok(NULL, sep_char);
}
printf("%s, %s, %s, %s\n", values[0], values[1], values[2], values[3]);
}
fclose(file);
}
else {
printf("Error");
}
}
全部谢谢!
答案 0 :(得分:3)
问题在于您的sscanf
语句:它会将令牌扫描到第一个空格。只需离开该行并执行
strcpy(values[i++], token);
我认为会这样做。
答案 1 :(得分:0)
这是使用scanf的常见问题。当它击中空格字符时它会停止。使用fgets读取整行,然后使用strtok。这是fgets的man page。
修改:我对您的实施情况看不够。您正在使用fgets来读取该行。我同意弗洛里斯的意见。你不需要那里的scanf。您已经拥有对令牌的引用,只需将其复制到您的值数组即可。