我有一个变量,我在其中读取.txt文件。该文件如下所示:
Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast#Element1|Element2|Element3|...|ElementLast
现在我想做的是,获取每个'Element1'并检查它是否等于特定的字符串
我阅读了很多关于函数strtok()
的内容,并尝试使用它
这是我的函数:(id是这个特殊字符串,我在函数期间将其转换。)
int PLUexists(int id) {
char idc[3];
sprintf(idc, "%d", id);
printf("%s", idc);
/* My Main String */
FILE *plu = fopen("kassa_plu.txt", "r");
char pluc[2000];
while( fgets(pluc, sizeof(pluc), plu) !=0 );
/* My Token */
char *token;
/* get first line */
token = strtok(pluc, "#");
while( token != NULL ) {
printf(" %s \n", token);
// Without that block, I get all lines seperated...
char t[255];
strcpy(t, token);
if ( strcmp(strtok(t, "|"), idc) == 0) {
printf("Jep");
return 1;
}
// End 'block'
token = strtok(NULL, "#");
}
return 0;
}
现在,如果我只是打印出第一个标记(并重复它),我将所有的行分开(参见下面),但是当我也解析printf(" %s \n", token);
和token = strtok(NULL, "#");
之间的代码时不行。
没有阻止:
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
Element1|Element2|Element3|...|ElementLast
用它:
Element1|Element2|Element3|...|ElementLast
Element2|Element3|...|ElementLast
Element3|...|ElementLast
...|ElementLast
ElementLast
答案 0 :(得分:1)
你的主要问题是,当你在循环内部用非空的第一个参数调用strtok()
时,你就告诉该函数放弃先前的标记化(通过#
分隔符)它是致力于执行新的标记化。您可以考虑使用strtok_r()
代替,这允许您一次维护多个标记化的状态,但由于您希望每行上只有第一个第一个标记,我不会考虑在内循环中使用strtok[_r]()
。
例如,这是基于strchr()
的类似方法:
while( token != NULL ) {
printf(" %s \n", token);
char *delim = strchr(token, '|');
if (delim) *delim = '\0';
if (strcmp(token, idc) == 0) {
printf("Jep");
return 1;
}
token = strtok(NULL, "#");
}