0
votes

Pourquoi pour la boucle ne finit jamais?

int ln;
printf("how many letters are your name?\n");
scanf("%d", &ln);
printf("Ok...enter your name by characters: \n");
char name[ln];
for (int i = 0; i<=ln; i++){
    scanf("%s", &name[i]);
}
This code should transform a name in the array but the for-loop never ends. Someone who can help me?

3 commentaires

Spécificateur de format, VLA, ... Bibliothèque standard a déjà des fonctions pour lire une chaîne.


Remarque: % s est pour la lecture Cordes .


Utilisez getchar () pour lire des caractères ... ou, si vous devez (mais vous ne devriez vraiment pas) ... scanf ("% c", ...)


5 Réponses :


0
votes

Pourquoi pour la boucle ne finit jamais? P>

à l'intérieur de la boucle, scanf ("% s", & nom [i]); code> tente de lire un nom ln + 1 code> fois, essayant de sauvegarder des données à l'extérieur nom [] code> limites. P>

Enregistrement de données en dehors de Nom [] code> Les limites sont comportement non défini em> (UB). Tout peut arriver. P>


boucle non nécessaire pour lire une ligne d'entrée sous forme de nom et nom [] code> trop petit. P>

char name[ln+1+1]; / One more for a \n and 1 for a \0
if (fgets(name, sizeof name, stdin)) {
  name[strcspn(name, "\n")] = '\0';  // lop off potential \n
  Success();
}


0 commentaires

0
votes

Dans la condition for Essayez de supprimer cette égalité et de voir, car vous allouez des octets LN dans la variable de nom, donc la variable que je vais commencer à 0 et aller à ln-1 xxx

Notez également im en utilisant% c ici pour numériser le caractère,% s scans String.


0 commentaires

0
votes

Parce que votre boucle pour la boucle doit fonctionner une fois de plus. Changer simplement xxx

à xxx


0 commentaires

0
votes

" pourquoi pour la boucle ne finit jamais? em>" p>

Premières choses d'abord, je ne pense pas que la boucle est infinie. Pour moi, il semble que vous veniez de déranger % s code> avec % c code> et interprétez l'attente de plus d'entrée comme une boucle "ne finit jamais". P>

Vous n'avez pas fourni suffisamment de ressources pour reconstruire votre problème, cependant. P>

Mais a-t-il commencé: P>

  1. Le spécificateur de conversion code>% s code> de scanf () code> est destiné à lire une chaîne, pas un seul caractère. Si vous souhaitez lire un seul caractère par itération, utilisez scanf ("% c", et nom [i]); code> ou nom [i] = getchar (); code> de scanf ("% s", & nom [i]); code> dans le pour code> boucle. P> li>

  2. Votre condition de boucle i est défectueuse, car vous essayez d'écrire un personnage plus que prévu avec celui-ci, car le comptage d'index commence à 0 code>, pas 1 code>. Utilisez i à la place. P> li>

  3. Une chaîne doit avoir un caractère nul de terminaison à la fin. Nom CODE> doit avoir un élément plus que pour simplement tenir les lettres du nom d'entrée. Egalement place nom [ln] = '\ 0'; code> après la boucle pour insérer un caractère null dans le dernier élément de VLA Nom code>. P>. li> ol>

    Remarque: h3>

    Si vous souhaitez lire une quantité variable de caractères de stdin code> qui est déterminé au moment de l'exécution, vous n'avez pas besoin de lire chaque caractère séparer et d'arrêter jusqu'à ce que le compteur atteigne ln - 1 code>. p>

    lecture d'une chaîne d'une quantité variable de caractères est un point, où fgets () code> est plus approprié que scanf () code>. p>

    Utiliser fgets (nom, taille de (nom), stdin); code> qui garantit que le Lire la chaîne Plus le caractère NULL de terminaison de chaîne s'adapte exactement à Nom code> et attrapez le nom une fois. P>

    int ln;
    
    printf("How many letters are in your name?\n");
    scanf("%d", &ln);
    getchar();              // catching left newline from scanf.
    
    char name[ln + 1];      // +1 for null character.
    
    printf("Ok...enter your name: \n");
    
    fgets(name, sizeof(name), stdin);   // Will read the name and append the null character.
    
    getchar();              // catching left newline from fgets. 
       
    


9 commentaires

J'ai essayé ce code mais quand je l'exécute, il s'arrête après 2 personnages


@ Jack_01 hmm ...: - / j'ai besoin de voir votre code corrigé, je suppose.


@ Jack_01 est ok ... entrez votre nom par des caractères: imprimé?


int ln; printf ("Combien de lettres sont dans votre nom? \ n"); scanf ("% d", & ln); getchar (); Char Nom [ln + 1]; printf ("OK ... entrez votre nom par des caractères: \ n"); fgets (nom, taille de (nom), stdin); getchar ();


@ Jack_01 d'accord. Quelle est votre entrée réelle et quand appuyez-vous sur Entrée?


Durée du nom ou des personnages?


@ JACK_01 Appuyez-vous sur Entrée après chaque personnage? Je pense avoir manqué de dire que vous ne devriez pas faire ça.


ah ok, merci, je vais essayer de mettre une fois le nom


@ Jack_01 n'a pas changé l'intention d'impression. Supprimé "par caractères" . Ma faute. Je m'excuse.



1
votes

% s est la chaîne de numérisation, donc techniquement, votre nom entier est considéré comme un élément. Je dois donc entrer de nombreuses chaînes. Il suffit de remplacer% s par% c et le code doit être prêt à utiliser


0 commentaires