2010-10-11 4 views
-1
int main(int argc, char** argv) { 
    char *test[5][20]; 
    char *input[20]; 
    int i; 
    for(i=0;i<5;i++){ 

    printf("enter> "); 
    fflush (stdout); 
    fgets(input,20,stdin); 
     *test[i] = *input; 
    } 

    for(i=0;i<5;i++) 
     printf("%d | %s\n",i,test[i]); 
    return 0; 
} 

sortie:Impossible d'imprimer tableau de chaînes sans obtenir des caractères ordures

Entrée> PWD

Entrée> pathd

Entrée> ls

Entrée> chemin echo $

Entrée> pwd 0 | pwd

1 | chemin▒] a▒▒a▒▒ # a▒▒ 2 | ls

3 | echo▒▒ (4 | PWD

Appuyez sur [Entrée] pour fermer le terminal ...

Je dois aussi être capable de lire en entrée qui a des espaces Merci

+0

Montrer comment 'test' est déclarée pourrait être utile – Arun

+0

@ArunSaha,' char * test [5] [20]; ' – Ruel

+0

S'il s'agit de devoirs, veuillez le marquer comme tel. –

Répondre

2

Utilisez memcpy(). Et vous devez supprimer les nouvelles lignes. Ici:

#include <stdio.h> 
#include <string.h> 

void chopnl(char *s) {    //strip '\n' 
    s[strcspn(s, "\n")] = '\0'; 
} 

int main() { 
    char test[5][20]; 
    char input[20]; 
    int i; 
    for(i=0;i<5;i++){ 
     printf("enter> "); 
     fflush (stdout); 
     fgets(input, 20, stdin); 
     chopnl(input); 
     memcpy(test[i], input, strlen(input)+1);//test[i] = input; 
    } 
    for(i=0;i<5;i++) 
     printf("%d | %s\n",i,test[i]); 
    return 0; 
} 
+0

Merci beaucoup ... une question pourquoi strlen (entrée) +1? –

+0

Le troisième argument dans 'memcpy()' est le nombre d'octets à copier. Et puisque 'strlen()' renvoie la longueur réelle d'une chaîne, elle n'inclut pas la terminaison nulle '\ 0', donc vous devez allouer de l'espace pour cela. – Ruel

+0

ok merci encore! –

1

Votre.! Une chaîne dans C est essentiellement un pointeur vers un caractère qui commence une séquence de caractères qui se termine par un octet nul

L'entrée est un tableau de pointeurs vers des caractères - ou dans ce but, un Ce que vous faites est de lire 20 caractères en entrée, où inpu t en ce que fgets expression agit comme l'adresse du premier élément du tableau. Vous lisez donc 20 caractères de stdin dans les 20 pointeurs d'entrée des caractères. Ce n'est pas ce que tu veux. Vous voulez lire les caractères dans l'espace pour une chaîne.

Je suppose que vous compilez en utilisant GCC - pensez à utiliser -Wall afin que GCC vous avertisse des problèmes de type.

Une autre question est

*test[i] = *input; 

Depuis cela semble devoir, je me sens comme je l'ai donné suffisamment de détails.

0

Je sais que cette question est répondue et est très ancienne, mais la solution acceptée est réellement faux. Si vous entrez plus de 19 caractères stdin sera laissé avec des octets qui seront lus sur les prochains fgets() et il trouvera le saut de ligne et l'entrée suivante sera incorrecte.

Voir le code suivant et notez quelques choses:

- Vous n'avez pas besoin d'un tampon séparé pour lire votre entrée en. Juste lire directement dans le tableau.

- Après avoir lu dans le tableau, retirez le '\n'

- Si besoin est, rincer stdin

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char test[5][20+1] = {{0}};  // extra space for NULL 
    int i; 
    int c; 
    char *ptr = NULL; 

    for(i=0;i<5;i++){ 
     printf("enter> "); 
     fgets(test[i], 20+1, stdin); // fgets read n-1 characters so we add 1 since our buffer has space for null already 
     if((ptr = strrchr(test[i], '\n'))) 
     { 
      *ptr = 0x00; 
     } 
     else 
     { 
      // need to flush stdin since '\n' wasn't found fgets() didn't read all of input 
      while((c = getchar()) != '\n' && c != EOF);  
     } 
    } 

    for(i=0;i<5;i++) 
     printf("%d | %s\n",i,test[i]); 

    return 0; 
} 
Questions connexes