2009-08-27 8 views
1

Je voudrais savoir comment lire une chaîne à partir de l'entrée standard de longueur 'n'. J'ai essayé à l'aide de la fonction fgets() mais avait un problème si je soumets une chaîne de longueur> nComment lire une chaîne de longueur 'n' à partir de l'entrée standard

#include <stdio.h> 

int STRING_SIZE=4; 
int getString(char *); 

int getString(char *str) 
{ 
    printf("\nEnter a string of length < %d: ", STRING_SIZE); 
    fgets(str, STRING_SIZE, stdin); 
    fflush(stdin); 
    printf("\n\n%s\n\n",str); 
    return 0; 
} 


int main(void) 
{ 

    char str1[1024]; 
    char str2[1024]; 

    getString(str1); 
    getString(str2); 

    fprintf(stdout, "%s\n", str1); 
    fprintf(stdout, "%s\n", str2); 

    return 0; 
} 

si j'entre une chaîne de taille plus de 4 pour str1 alors les caractères restants OBTIENNENT attribués automatiquement à str2 .

Y a-t-il un moyen de donner des chaînes aux deux str1, str2 même après avoir donné string> STRING_SIZE?

J'utilise un compilateur GCC 4.3 et si je compile le code source ci-dessus

$ ./a.out 

Enter a string of length < 4: 12345678 


123 


Enter a string of length < 4: 

456 

123 
456 
+0

ne sait pas quel est votre objectif – qrdl

+1

utilisant fflush() sur les flux d'entrée n'est pas défini dans C –

+0

Merci « Neil Butterworth » Je ne pourrai jamais essayer d'utiliser de cette façon à nouveau. – codingfreak

Répondre

3

Une stratégie consiste à vérifier votre chaîne pour la présence d'une nouvelle ligne; Si vous n'en trouvez pas, votre utilisateur a potentiellement saisi une chaîne trop longue pour le tampon cible. Dans ce cas, vous pouvez appeler à plusieurs reprises fgets() avec un second tampon factice comme la cible et jeter l'entrée parasite:

if (fgets(str, STR_SIZE, stdin) != NULL) 
{ 
    char *nl = strchr(str, '\n'); 
    if (nl == NULL) 
    { 
    /** 
    * Newline not found, input string too long for target buffer. 
    * Repeatedly read from input stream into a dummy buffer 
    * until newline is seen or fgets() returns EOF or error. 
    */ 
    char dummy[STR_SIZE]; 
    char *r; 

    printf("Warning - input string longer than expected, ignoring excess characters\n"); 

    do { 
     r = fgets(dummy, sizeof dummy, stdin); 
    } while (r != NULL && strchr(dummy, '\n') == NULL); 
    } 
    else 
    { 
    /** 
    * Input string is okay, remove newline character 
    */ 
    *nl = 0; 
    } 
} 
else 
{ 
    /** 
    * EOF or error detected on read; handle that here 
    */ 
} 
+0

Merci John vraiment très instructif et méthode facile .... – codingfreak

1

Assurez-vous que vous allouez str1 et str2 correctement.

char str1[STRING_SIZE]; 
char str2[STRING_SIZE]; 

De plus, gardez à l'esprit que fgets sera null-fin à votre chaîne, de sorte que vous êtes vraiment obtenir que STRING_SIZE - 1 caractères.

+0

Salut Andrew Je viens d'ajouter le code. Je pense que je le fais correctement comme vous l'avez mentionné. – codingfreak

1

Utilisez getch dans une boucle.

+7

getch n'est pas une fonction standard, getc/fgetc l'est. –

0

Donnez ce un coup de feu, en utilisant getc() au lieu de se(). J'ai fait quelques tests rapides sur OS X. J'ai fait quelques autres changements qui n'ont pas beaucoup d'importance. Vous devriez être capable de les repérer. La seule chose qui importe est la modification de la définition getString(): notez l'argument len ​​qui spécifie la taille du tampon char *.

#include <stdio.h> 

#define MAX_LEN 8 
#define STRING_LEN 6 

int getString(char *str, int len) 
{ 
     int n_read = 0; 
     int c; 
     int m_len = MAX_LEN; 

     if (len < m_len) m_len = len; 

     printf("\nEnter a string of length < %d: ", MAX_LEN); 

     while ((n_read < len) && (c = getc(stdin)) && c!= EOF && c!='\n') { 
       if (n_read < m_len-1) { 
         str[n_read++] = c; 
       } 
     } 
     str[n_read] = '\0'; 

     return n_read; 
} 

int main(int argc, char **argv) 
{ 
     char str1[STRING_LEN]; 
     char str2[STRING_LEN]; 

     getString(str1, STRING_LEN); 
     getString(str2, STRING_LEN); 

     fprintf(stdout, "%s\n", str1); 
     fprintf(stdout, "%s\n", str2); 

     return 0; 
} 
+0

Cela semble fonctionner avec mes tests initiaux Rob ..... merci pour la réponse – codingfreak

0

Avec les réponses données par "Rob Jones" et "John Bode" Je suis venu avec une solution intermédiaire.

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

#define BUF_SIZE 6 
#define STRING_SIZE 4 

/* 
* void getStringStdin(char *, int , int); 
* 
* 1: BUF  :Pointer to the array of characters where input string is to be stored. 
* 2: BUF_LEN :Is the length of the rray of characters where the string is stored.buffer where we save the string. 
* 3: STRING_LEN :Is the length of the string. 
* 
* NOTE: STRING_LEN < BUF_LEN 
* 
*/ 

getStringStdin(char *buf, int buf_len, int str_len) 
{ 

    int ch; 
    char *s; 
    int len; 

    if(str_len>=buf_len) 
    len=buf_len-1; 
    else 
    len=str_len; 

    printf ("\nEnter string of length %d(Remaining part is ignored) : ",len); 

    if((fgets(buf, len+1, stdin)) != NULL) 
    { 
    s=my_strchr(buf,'\n'); 

    if(s!=NULL) 
    { 
     *s='\0'; 
    } 
    else 
    { 
     while ((ch = getchar()) != '\n' && ch != EOF); 
    } 
    } 
} 


    int main(void) 
    { 
     int i=0; 
     char buf[BUF_SIZE]; 

     do 
     { 
      getString(buf, BUF_SIZE, STRING_SIZE); 
      printf ("\nString : %s\n", buf); 
      i++; 
     }while(i<2); 

     return 0; 
    } 
+0

Que se passe-t-il si STRING_SIZE est supérieur à BUF_SIZE? L'argument 'len' devrait être utilisé pour spécifier la longueur (taille) du paramètre 'buf' à getString(). Essayez de créer STRING_SIZE '7' et tapez sept caractères ou plus. –

+0

Belle entrée Rob Jones donc j'ai fait le code change en conséquence – codingfreak

Questions connexes