0

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

我的文本文件看起来像

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<stdio.h>


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);
4

2 回答 2

1

好吧, usingstrtok(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
于 2013-10-12T07:16:39.450 回答
0

我认为您不必仅使用分隔符strtok()来获取令牌的位置,而只需遍历每一行,然后对分隔符进行逐字符比较...(希望这对您有所帮助)

我准备了一个名为 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 <ansi_c.h>
//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<len;j++)
        {
            if(ch[j] == ':') 
            {
                position[line][k] = j+1;//position of token (1 after delim)
                k++; //increment position index for next token
            }
        }
        k=0; //getting new line, zero position index
    }
    fclose(fp);
    return 0;
}

要获得以下结果:(行是文件中的行,列是每个标记的位置。假设第一个标记位于位置 0,并且未报告)

在此处输入图像描述

于 2013-10-14T15:51:49.803 回答