我有一个变量,我在其中读取了一个.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
最佳答案
您的主要问题是,当您在循环中使用非空的第一个参数调用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, "#");
}
关于c - 获取C中字符串的第一个元素的第一个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41495291/