2017-03-11 6 views
0

J'essaye d'écrire un programme qui prend l'entrée de l'utilisateur deux fois, concatène alors le résultat, mais je me heurte à un problème.strcat ne se comporte pas comme souhaité

Mon résultat attendu serait:

What would you like your message to be? input 
message received: input 

What would you like your message to be? words 
message received: words 

new message: inputwords 

Au lieu de cela, je reçois une réponse embrouillée.

sortie Received:

What would you like your message to be? input 
message received: input 

What would you like your second message to be? words 
message received: words 

new message: ??s?inputwords 

Première question:

Comment puis-je concaténer ces deux chaînes correctement?

De plus:

Depuis que je suis seulement accepter 5 caractères d'entrée pour chaque message, comment pourrais-je aller sur déblayer les éléments restants dans le tampon entre ces appels fgets sans lire le reste dans la « poubelle » tableau?

Voici le code que je utilise:

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


int main() { 

    char message[6]; 
    char garbage[9999]; 
    char message2[6]; 

    printf("\nWhat would you like your message to be? "); 
    fgets(message, 6, stdin); 

    printf("message received: %s\n", message); 

    fgets(garbage, 9999, stdin); //this is gross 

    printf("\nWhat would you like your second message to be? "); 
    fgets(message2, 6, stdin); 

    printf("message received: %s\n", message2); 

    fgets(garbage, 9999, stdin); //still gross 

    char newString[25]; 
    strcat(newString, message); 
    strcat(newString, message2); 

    printf("new message: %s\n", newString); 
    return 0; 

} 

Note: Je suis conscient que je prendras la valeur de retour pour fgets, je suis parti que pour la brièveté.

+1

'strcat' ajoute une chaîne à une autre. Mais vous l'avez appelé avec un tampon non initialisé pour l'argument. –

Répondre

1

Votre problème est

char newString[25]; 
strcat(newString, message); 
strcat(newString, message2); 

strcat() suppose le premier argument a été initialisé en utilisant une chaîne à terminaison nulle. Le premier appel fournit un tableau non initialisé, de même qu'un comportement indéfini. Pour corriger, il suffit de modifier le premier appel à strcpy() - qui va copier message à newString sans compter sur newString en cours d'initialisation.

Pour rincer une ligne d'entrée (c.-à-lu jusqu'à la fin du fichier, une erreur de lecture ou une nouvelle ligne est rencontrée) une technique commune est

int c; 
while ((c = fgetc(stdin)) != '\n' && c != EOF) { } 

Cependant, il est généralement pas considéré comme une bonne idée de mélangez l'entrée orientée caractère (comme fgets()) avec l'entrée orientée caractère (comme fgetc()) car les deux manipulent les choses comme les nouvelles lignes différemment.

Une alternative à l'aide fgets() est

char buffer[2]; 
while (fgets(buffer, sizeof buffer, stdin) != NULL && buffer[0] != '\n') {} 

Il est nécessaire d'utiliser un tampon (le nombre entier c dans la première forme, et buffer dans la seconde forme).Ces deux options réduisent la taille de la mémoire tampon nécessaire (à l'aide sizeof intfgetc() ou à l'aide 2fgets())

Certaines personnes suggèrent d'utiliser fflush(stdin). C'est une mauvaise idée - selon la norme C, fflush() donne un comportement indéfini sur les flux d'entrée.

1

strcat nécessite une chaîne terminée par un caractère nul, alors que votre tampon n'est pas initialisé. Remplacer le premier appel à strcat avec un appel à strcpy:

char newString[25]; 
strcpy(newString, message); 
strcat(newString, message2); 

Vous pouvez également utiliser sprintf:

char newString[25]; 
sprintf(newString, "%s%s", message, message2);