2011-12-01 19 views
7

Mi función foo(char *str) recibe str que es una cadena multilínea con nuevos caracteres de línea con terminación nula. Estoy tratando de escribir un ciclo while que itera a través de la cadena y opera en una línea. ¿Cuál es una buena forma de lograr esto?¿Cuál es una buena forma de recorrer líneas en una cadena de varias líneas?

void foo(char *str) { 
    while((line=getLine(str)) != NULL) { 
     // Process a line 
    } 
} 

¿Es necesario poner en práctica getLine mismo o hay una función incorporada que hacer esto por mí?

+1

Hay un 'getline 'incorporado, pero no es lo que quieres. Es para obtener una línea a la vez de un archivo. – Kevin

Respuesta

2

Tendrá que implementar algún tipo de análisis basado en el nuevo carácter de línea usted mismo. strtok() con un delimitador de "\ n" es una opción bastante buena que hace algo parecido a lo que estás buscando, pero tiene que usarse de forma ligeramente diferente a tu ejemplo. Sería más como:

char *tok; 
char *delims = "\n"; 
tok = strtok(str, delims); 

while (tok != NULL) { 
    // process the line 

    //advance the token 
    tok = strtok(NULL, delims); 
} 

Debe tener en cuenta, sin embargo, que strtok() es a la vez destructivo y no para las hebras.

1

Creo que podría utilizar strtok, que tokenizes una cadena en paquetes delimitados por unos caracteres específicos, en su caso, el carácter de nueva línea:

void foo(char *str) 
{ 
    char *line = strtok(str, "\n"); 
    while(line) 
    { 
     //work with line, which contains a single line without the trailing '\n' 
     ... 

     //next line 
     line = strtok(NULL, "\n"); 
    } 
} 

Pero hay que tener en cuenta que esto altera el contenido de str (se en realidad reemplaza el '\n' s por '\0' s), por lo que es posible que desee hacer una copia de antemano si lo necesita más.

0

Puede utilizar fgets para hacer el trabajo getLine: http://linux.die.net/man/3/fgets

+0

Quiere leer líneas de una cadena en lugar de un archivo. No estoy seguro si C tiene cadenas de transmisión. –

+0

@ChristianRau C no tiene 'stringstream's, pero tiene' fgets', que no los usa. Pero tienes razón en que el OP quería líneas de una cadena, no de un archivo. – Kevin

+0

@Kevin Solo pensé que podría haber una manera de crear un descriptor de archivo para una cadena, que sería el modo C de una secuencia de cadenas. –

1

Sooo ... un poco tarde, pero a continuación es una versión re-entrante de respuesta de @ DeBeer y @Christian Rau - notar strtok_r en lugar de strtok. Esto se puede invocar desde varios subprocesos usando diferentes cadenas.

char *tok; 
char *saveptr; 
char *delims = "\n"; 
tok = strtok_r(str, delims, &saveptr); 

while (tok != NULL) { 
    // process the line 

    //advance the token 
    tok = strtok_r(NULL, delims, &saveptr); 
} 

Tenga en cuenta que todavía es destructivo, ya que modifica la cadena que se está tokenizando.

Cuestiones relacionadas