2013-05-03 2 views
0

Je ne suis pas sûr de ce qui se passe avec mon programme, mais j'ai essentiellement une fonction qui essaie de lire un tas de chaînes à partir d'un fichier et le passe en mode principal pour un traitement ultérieur. Voici mon code:Valeur indésirable de chaîne utilisant C

char* readFile(FILE* fpFile) 
{ 
// Local Declaration 
char *ptr; 
char temp[1000]; 

// Statment 
fgets(temp, sizeof(temp), fpFile); 
ptr = temp; 

return ptr; 
}// readFile 

Le problème se produit lorsque la fonction repasse le pointeur sur principal. J'ai essayé d'imprimer la chaîne, mais je ne reçois que les premières lignes correctes et après c'est indésirable. En outre, si je devais imprimer ptr dans la fonction readFile il imprime parfaitement bien et le pointeur qui est passé à la principale imprime également. Y a-t-il quelque chose qui me manque? Toute aide serait appréciée.

est ici la sortie je reçois

2000 1990 
New York-No. NJ; 21199865 19549649 
Los Angeles area; 16373645 14531629 
Chicago area; 9157540 8239820 
Washington-Baltimore; 7608070 6727050 
San Francisco area; 7039362 6253311 
Philadelphia-Atlantic City area; 6188463 5892937 
Boston\240\365\277_\377 

Il est censé être deux fois plus d'entrées, mais il est stoping comme un quart du chemin.

+1

OH NO! Vous feriez mieux de jeter un oeil à: http://stackoverflow.com/questions/4824342/returning-a-local-variable-from-function-in-c – Mikhail

Répondre

4

char temp[1000]; est local. Lorsque le contrôle est hors de readFile(), cette mémoire peut être allouée à un autre but. Il existe deux façons, soit le stockage peut être un tableau global ou de la mémoire allouée dynamiquement en utilisant malloc().

char* readFile(FILE* fpFile) 
{ 
// Local Declaration 
char *ptr = malloc(1000); 

// Statment 
fgets(ptr, 1000, fpFile); 

return ptr; 
}// readFile 
+1

Ne pas conseiller tableaux globaux, s'il vous plaît. Au lieu de cela, il est courant de demander à l'appelant de fournir le stockage. Aussi, 'sizeof (char) === 1' par standard. – KAction

+0

@KAction, Got it :) – Jeyaram

+0

@Jeyaram Merci d'avoir signalé mon problème. Je vais certainement garder cela à l'esprit et postuler pour des utilisations futures. – Nathan

0

La variable est seulement garantie de vivre dans le cadre de la fonction. Cela inclut les données que vous avez attribuées pour temp. Après tout, tout peut et va arriver à ces cellules 1000.

Il y a une deuxième chose qui ne va pas dans votre fonction: Il semble s'agir d'une fonction existante qui fournit déjà votre fonctionnalité cible.

était-

char* readFile(FILE* fpFile) 
{ 
// Local Declaration 
char *ptr; 
char temp[1000]; 

// Statment 
fgets(temp, sizeof(temp), fpFile); 
ptr = temp; 

return ptr; 
}// readFile 

Travaux

char* readFile(FILE* fpFile, char* ptr, int n) 
{ 
// Statment 
fgets(ptr, sizeof(char)*n, fpFile); 
ptr = temp; 
return ptr; 
}// readFile 
void fun() 
{ 
//somehow File* 
int num = 1000; 
char* pointer = (char*) malloc(sizeof(char)*num); 
pointer = readFile(file,pointer,num); 
} 

devrait être

void fun() 
{ 
//somehow File* 
int num = 1000; 
char* pointer = (char*) malloc(sizeof(char)*num); 
fgets(file,pointer*sizeof(char)); 
} 
Questions connexes