Duda sobre el lenguaje de programación C funcionando bajo el sistema operativo Linux

Buenas tardes.
Quisiera hacerte una pequeña consulta con respecto a C, utilizado bajo linux.
La cuestión es la siguiente: El programa consiste básicamente en coger las lineas de un fichero, tipo:
Pepe, AE380, 52,31
De las cuales, pues el Nombre es el primer campo, el 2º corresponde al código postal, el 3º la renta mensual que tiene que pagar ese tío, y el 4º campo es lo que ha pagado hasta la fecha.
El programa ya esta hecho. Por eso no te preocupes. Pero si es verdad que tengo un pequeño problema. Una de las lineas, corresponde a un tío que tiene nombre compuesto, es decir:
Le Fevre,ER873,199,120
Entonces, en el resultado final me aparecen como dos lineas distintas, es decir:
Le,0,0,0
Fevre, ER873, 199,120
Esa es la cuestión. Como decirle al programa, que es un nombre compuesto, y no dos líneas distintas.
*En teoría, debería de hacerlo funcionar para cualquier nombre compuesto, no solo si se da el caso de que el tío se llama Le Fevre.
Gracias de antemano.
Javi
Respuesta
1
Mu buenas tocayo!
Por lo que m dices, lo que casi seguramente t este pasando es que el programa que separa una linea en sus diferentes campo usa para ello la función sscanf.
La función sscanf separa una cadena con formato en sus diferentes elementos. El problema esta en que si sscanf espera 4 cadenas hay que darle 4 cadenas, ni más ni menos. Por ejemplo:
char cad[20]="Hola Javi";
char nombre[20];
sscanf(cad,"Hola %s",nombre);
//en el array nombre se copiaria "Javier"
pero si cad valiera algo asi:
char cad[20]="Hola Juan Antonio";
char nombre[20];
sscanf(cad,"Hola %s",nombre);
//En nombre se copiaría "Juan", no "Juan Antonio", ya que "Antonio" lo toma como otra cadena
En tu caso la función se vuelve loca porque donde espera un entero hay una array de caracteres.
Ahora, posibles soluciones, se m ocurren 3:
1- No permitir espacios en el campo nombre, sustiuyendolos por guiones bajos (Le Fevre ---> Le_Fevre), de forma que lo tome como una cadena.
2- Si la primera llamada a sscanf produce 3 ceros en el resto de campos, volver a llamarla pero esta vez esperando 2 cadenas el campo nombre en vez de 1. Si esperando 2 también falla, llamarla esperando 3 cadenas, y así hasta un máximo de cadenas para el campo nombre que establezcas.
3- (La que yo haría) cambiar la forma de separar la cadena aprovechando que en el fichero están separadas por comas. Todo lo que se lea hasta la primera coma es el campo nombre, lo que se lea hasta la segunda coma el campo código postal y así con todos
Bueno, y creo que eso es todo lo que t puedo decir de momento.
Buenas de nuevo.
Gracias por haberme contestado tan rapido. Efectivamente esa 3ª solución es la que ando buscando, pero no se cual es el comando que le he de introducir para que todo lo que me lea hasta la primera coma, se guarde en la variable el nombre.
Las opción de cambiar el nombre, para que tenga "_", ya la contemple, y efectivamente funcionaba, pero el profesor me dijo que no podía modificar el fichero de origen (el de los nombres).
Te agradecería enormemente que me dijeras que linea/s hay que poner, para que me lea todo hasta la primera coma, y me lo guarde en una sola variable.
(Teniendo en cuenta que al final de cada linea no hay coma).
Muchas gracias
Javi
El otro dia q t di la contestacion recorde q habia una funcion q t seria de gran ayuda... pero... no recordaba el nombre :(((
A esta función le pasas 2 cadenas, una la que quieres separar y otra, la de separadores.
La función es strtok
T pasteo el ejemplo que viene en la MSDN de Microsoft.
Example
/* STRTOK.C: In this program, a loop uses strtok
* to print all the tokens (separated by commas
* or blanks) in the string named "string".
*/
#include <string.h>
#include <stdio.h>
char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;
void main( void )
{
printf( "%s\n\nTokens:\n", string );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
printf( " %s\n", token );
/* Get next token: */
token = strtok( NULL, seps );
}
}
Output
A string of ,,tokens
And some more tokens
Tokens:
A
string
Of
Tokens
And
Some
More
Tokens
Como puedes comprobar en el ejemplo utiliza de separador la coma, el tabulador y el salto de linea, así que t sera muy fácil adaptarlo a tu programa.
No olvides que una vez tengas las cadenas los campos numéricos has de pasarlos a entero (función atoi). Antes lo hacías automáticamente con sscanf.
Venga, nos vemos
®Aguin ©

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas