如何在C中获取分隔的字符串的位置

如何获得分隔字符串的位置?

我的文本文件看起来像

at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash avahi:x:109:111:User for Avahi:/var/run/avahi-daemon:/bin/false beagleindex:x:110:112:User for Beagle indexing:/var/cache/beagle:/bin/bash 

我的C代码看起来像

 #include int main(int argc, char *argv[]) { char *str, *saveptr; char ch[100]; char *sp; FILE *f; int j; char searchString[20]; char *pos; f = fopen("passwd", "r"); if (f == NULL) { printf("Error while opening the file"); } while (fgets(ch, sizeof ch, f)!= NULL) { /*printf("%s\n", ch); */ for (j = 1, str = ch; ; j++, str= NULL) { char *token = strtok_r(str, ": ", &saveptr); if (token == NULL) break; //printf("%s---\n---", token); printf("%s",token); } } fclose(f); 

好吧,使用strtok(str, ": ",将你的字符串分隔在空格和冒号上,这可能不是你想要的。此外, strtok将多个连续的分隔符作为单个分隔符处理(因此它永远不会返回两个冒号之间的空字符串),这不是解析passwd所需的。

相反,你可能只想使用strchr:

 while (fgets(ch, sizeof ch, f)!= NULL) { char *token, *end; for (j = 1, token = ch; token; j++, token = end) { if ((end = strchr(token, ':'))) *end++ = 0; ...do something with token and j 

我不认为你必须使用strtok()来获取由分隔符分隔的标记的位置 ,而只是简单地遍历每一行,并通过char比较为分隔符做一个char …(希望这会对你有帮助)

我准备了一个名为GetDelimPosition.txt的输入文件:

 at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash avahi:x:109:111:User for Avahi:/var/run/avahi-daemon:/bin/false jamil:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash javier:x:109:111:User for Avahi:/var/run/avahi-daemon:/bin/false jiame:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash jose:x:109:111:User for Avahi:/var/run/avahi-daemon:/bin/false 

并使用以下代码:(当然,您将根据需要进行修改)

 #include  //edit this line as needed: #define FILE_LOC "C:\\dev\\play\\GetDelimPosition.txt" int main(void) { FILE * fp; char ch[260]; int line=-1; int position[80][100]={0}; //lines x DelimPosition memset(position, 0, 80*100*sizeof(int)); int i=-1,j=0, k=0; int len; fp = fopen(FILE_LOC, "r"); while (fgets(ch, sizeof ch, fp)!= NULL) { line++; //increment line len = strlen(ch); for(j=0;j 

要获得以下结果:(行是文件中的行,列是每个令牌的位置。第一个令牌假定在位置0,未报告)

在此处输入图像描述