Как получить позицию разделенной разделительной строки в 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 рассматривает несколько последовательных символов разделителя как один разделитель (поэтому он никогда не вернет пустая строка между двумя двоеточиями), что вам не подходит для parsingа 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 и не сообщается)

введите описание изображения здесь