2011-03-19 2 views
1

J'ai écrit le code C suivant pour obtenir une liste de chaînes de l'utilisateur. Mais les chaînes stockées donnent des valeurs bizarres.Les chaînes extraites de l'utilisateur en C sont brouillées

#include <stdio.h> 
#include <stdlib.h> 


#define MAX_STRING_LENGTH 50 


void readInStrings(char* arr[],int n) 
{ 
    int i=0; 
    char line[MAX_STRING_LENGTH]; 

    for(i=0;i<n;i++){ 
    arr[i]=malloc(MAX_STRING_LENGTH); 
    printf("Enter another string : "); 
    scanf("%s",&arr[i]); 
    //fgets(&arr[i],MAX_STRING_LENGTH,stdin); 
    } 



    printf("Strings read in correctly.... \n"); 

    printf("Displaying out all the strings: \n"); 
    for(i=0;i<n;i++){ 
    printf("%s\n",&arr[i]); 
    } 
} 



void testStringInputs() 
{ 
    printf("Enter the number of entries : "); 
    int n; 
    scanf("%d",&n); 

    char* strings[n]; 
    readInStrings(strings,n); 
} 

Exemple d'entrée:

Entrez le nombre d'entrées: 3
Entrez une autre chaîne: Alladin
Entrez une autre chaîne: Barack Obama
Entrez une autre chaîne: Les chaînes lues correctement .. ..
Affichage de toutes les chaînes:
AllaBaraObama
BaraObama
Obama

Problèmes: 1) Pourquoi une chaîne ne prend pas en tant qu'entrée du tout?
2) Pourquoi les chaînes affichées sont-elles brouillées comme ça?

Le problème est le même si j'utilise gets() ou fgets() à la place de scanf().

+1

fgets est une option beaucoup plus sûre si vous faites la correction qui est donnée dans la réponse. Vous pouvez facilement surcharger le tampon avec scanf (et% s) ou obtient. – jonsca

+0

Si je n'utilise pas l'option & arr [i] dans l'instruction printf, le programme plante. Et le problème reste le même même avec fgets(), les chaînes sortent brouillées. Et une itération de l'entrée pour la boucle est également ignorée. –

Répondre

1

Retrait de la & (comme le premier answerer noté) dans scanf("%s",&arr[i]); et printf("%s\n",&arr[i]); a fait l'affaire pour moi. Notez également que si vous avez compilé avec des avertissements au maximum, votre compilateur vous aurait immédiatement indiqué que le & était égaré.

+0

Pourriez-vous me dire pourquoi une seule itération de fgets() est ignorée quand je l'utilise? Le scanf() fonctionne bien. –

+1

Mettez dans 'getchar();' immédiatement après 'scanf ("% d ", &n);' dans 'testStringInputs()'. Lorsque vous tapez "3 " 3 est stocké dans n, mais il y a un excès '\ n 'dans le flux d'entrée.Le premier fgets dans la fonction a été ramasser comme une ligne d'entrée – jonsca

+0

Oui Oui, cela a fonctionné Merci, y at-il un endroit où je peux apprendre à éviter plus de ces pièges en entrée/sortie C? Un livre, ou un site Web? –

4

arr [i] est déjà un pointeur, vous n'avez pas besoin &

1

Il est préférable d'utiliser un tableau de tableaux (deux dimensions) au lieu de tableau de pointeurs. J'ai eu du mal à corriger votre code. Donc, j'ai changé le code à ce

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_STRING_LENGTH 50 
void readInStrings(char (*arr)[MAX_STRING_LENGTH],int n) 
{ 
    int i; 
    for(i = 0 ; i< n+1; ++i) 
    fgets(*(arr+i),MAX_STRING_LENGTH,stdin); 
    printf("Strings read in correctly.... \n"); 
    printf("Displaying out all the strings: \n"); 
    for(i=0;i< n+1;i++){ 
    printf("%s",arr[i]); 
    } 
} 
int main() 
{ 
    printf("Enter the number of entries : "); 
    int n; 
    scanf("%d",&n); 
    char strings[n][MAX_STRING_LENGTH]; 
    readInStrings(strings,n); 
    return 0; 
} 
+0

Mais un tableau de chaînes est un tableau de pointeurs, n'est ce pas? Je savais que votre solution était une façon de le faire, mais je voulais être ... conceptuellement propre, si vous le pouvez. –

Questions connexes