Voici mon code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char firstName[10];
char lastName[10];
char fullName[30];
int length, length2;
printf("Please enter the first name: ");
scanf("%s", firstName);
length = strlen(firstName);
while (length > 10)
{
printf("Error! First name should have < 10 characters.\n");
printf("Please enter the first name again: ");
scanf("%s", firstName);
length = strlen(firstName);
}
printf("Please enter the last name: ");
scanf("%s", lastName);
length2 = strlen(lastName);
while (length2 > 10)
{
printf("Error! Last name should have < 10 characters.\n");
printf("Please enter the last name again: ");
scanf("%s", lastName);
length2 = strlen(lastName);
}
strcpy(fullName, firstName);
strcat(fullName, " ");
strcat(fullName, lastName);
printf("The full name is: %s\n", fullName);
return 0;
}
3 Réponses :
La logique pour moi semble bien mais il devrait y avoir si l'état au lieu de la boucle. P>
Pourquoi devrait-il y avoir un si code> au lieu d'un pendant code>?
Une solution facile pour votre cas est d'utiliser Strcpy () code> et strcat () code> ne sont pas de toute la longueur-sécurité. Il faut utiliser strncpy () code> et strncat () code>. Mais si le tampon n'est pas assez long, ces deux fonctions ne se terminent pas. snprintf () code> qui sera toujours null terminer: p>
Chaque fois que vous utilisez des tableaux de taille fixe dans C, comme Comme mentionné dans mon premier commentaire, lors de l'utilisation du qui soulève le meilleur conseil que quiconque peut donner - ne tentez pas de lire des lignes d'entrée utilisateur avec Si vous souhaitez vous assurer que l'utilisateur vous donne une entrée (ou des annuels) valide, il suffit de placer votre invite et de lire dans une boucle continue et Lorsque vous lisez plus d'une entrée dans le même tampon comme Pour vous assurer que l'entrée s'adaptera, lisez-le dans un tampon temporaire de taille suffisante (* Ne lésinez pas la taille de la mémoire tampon!), par exemple p> ci-dessus, vous avez un tampon temporaire de ( note: strong> Il n'y a pas besoin de Notez également l'utilisation de La lecture du nom de famille est presque identique au prénom, sauf lorsque vous allez ajouter un nom de famille à la mettant tout à fait, vous pourriez faire: p> Exemple d'exemple Utilisez / sortie < / strong> p> ou le cas où l'utilisateur annule l'entrée: p> regarde les choses et laissez-moi savoir si Vous avez d'autres questions. P> p> FULLNAME CODE> et lecture des informations dans la matrice, vous devez mettre votre chapeau de comptables et vous assurer que vous n'écrivez plus de caractères à la matrice que ce qu'il ne peut HOLD (moins 1 code> caractère du caractère Nul-terminade em> si vous souhaitez utiliser le tableau de caractères en tant que chaîne) SCANF CODE> La famille, vous devez utiliser le modificateur em> largeur de champ em> pour vous assurer que scanf code> ne lit plus que Taille - 1 code> caractères conserver la place pour le caractère Nul-terminant em>. Sinon, scanf code> sera heureux d'écrire en dehors des limites de votre matrice invoquant comportement non défini em> (signification définie l'exécution de votre code est terminée à ce stade et que votre code pourrait sembler fonctionner normalement ou segfault em> - ou quoi que ce soit entre les deux) p> scanf code> em>. Utilisez plutôt fgets code> (ou posix getline code>) pour lire une ligne entière à la fois, puis analyser tout ce dont vous avez besoin de la ligne (ou si vous utilisez toute la ligne en tant que chaîne, Il suffit de couper le '\ n' code> à partir de la fin). De cette façon, ce qui reste dans votre mémoire tampon d'entrée ne dépend pas du spécificateur de conversion code> eM> em> utilisé (qui tourmente les nouveaux C programmeurs de C ...) p> < P> Lors de la prise d'entrée de l'utilisateur, vous devez toujours protéger contre l'entrée d'annulation de l'utilisateur en entrant Ctrl + D kbd> (ou Ctrl + Z kbd> sous Windows) pour générer un manuel Eof code>. Vous faites cela en vérifiant le retour de la fonction d'entrée que vous utilisez. P> pause; code> la boucle une fois que l'entrée a satisfait toutes vos conditions. p> FullName code>, il aide à Gardez une variable contenant le disponible code> (ou restant code>). De cette façon au lieu de tester la taille de la mémoire tampon complète pour votre deuxième entrée, vous testez les caractères restants disponibles dans le tampon pour voir si votre lastname code> sera adapté (plus un caractère supplémentaire pour le " " code> (espace) entre le premier / nom Nom. P> 1024 code> caractères - qui devrait être plus que suffisant à moins que le chat de l'utilisateur se dorme sur le clavier . Vous allez lire dans le tampon 1024 CODE> et puis testez si cela s'adaptera dans les caractères code> disponibles code> pour FULLNAME code>. Combinoir qui sera une lecture continue boucle que vous pourriez faire: p> prénom code> ou lastname code> comme vous mettez à la fois en FullName code>. Il suffit de lire avec buf code> et d'ajouter à FULLNAME CODE> Comme vous allez) P> strcspn code> qui renvoie le nombre de caractères de la chaîne non contenue dans l'ensemble exclude "\ r \ n" code>. Donc, il lit le nombre de caractères dans la chaîne jusqu'à la première fin de ligne rencontrée - an écrase la ligne terminant avec zéro (identique que '\ 0' code>) sur Nul-terminer à ce point . Vous pouvez utiliser strallen code>, mais strcspn code> peut le faire pour vous incorporer l'ensemble excluant vous permettant de terminer Nul-terminer dans une seule commande. P> FullName code> Vous devez ajouter un "" code> avant de faire. La différence étant: p>
scanf ("% 9s", prénom); code> -prénom code> ne peut jamais contenir plus de9 + 1 code> caractères afin quetandis que (longueur> 10) code> est impossible sans comportement indéfini i> ... (la même chose s'applique àlastname code>) alors quelle est la leçon? Ne lésinez jamais sur la taille de la mémoire tampon! I> et protégeez vos limites de la matrice au point de remplissage (pas après - il est trop tard alors).