Cómo obtener la posición de la cadena separada delimitada en C

¿Cómo obtengo la posición de la cadena separada delimitada?

Mi archivo de texto parece

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 

Mi código C parece

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

Bueno, si usas strtok(str, ": ", dividirás tu cadena en espacios y en dos puntos, lo que probablemente no sea lo que quieres. Además, strtok trata varios caracteres delimitadores consecutivos como un solo delimitador (por lo que nunca devolverá un cadena vacía entre dos puntos), que no es lo que desea para analizar passwd.

En su lugar, probablemente solo quieras usar 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 

No creo que tenga que usar strtok() solo para obtener la posición de un token separado por delimitadores, sino simplemente caminar por cada línea y hacer una comparación char por char para el delimitador … (espero que esto le ayude)

Preparé un archivo de entrada llamado 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 

Y usó el siguiente código: (por supuesto, lo modificará según sea necesario)

 #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 

Para obtener los siguientes resultados: (las filas son líneas en el archivo, las columnas son posiciones de cada token. El primer token se asume en la posición 0 y no se informa)

introduzca la descripción de la imagen aquí