0
votes

Quand j'imprime ma chaîne, il imprime plus de longueur

mon code strud> xxx pré>

entrée strong> p> xxx pré>

FORT> P>

bcabbcde

c

6 commentaires

str2 ne contient pas de chaîne car il n'est pas terminé null. Vous ne devez pas utiliser % s qui nécessite une chaîne. Cela entraîne un comportement non défini.


Une chaîne est une séquence de caractères terminés par un \ 0 . Si vous ne terminez pas la chaîne, printf ira au-delà de votre chaîne et imprime tout ce qu'il trouve en mémoire (dans ce cas STR). Augmentez la taille STR2 à 3, définissez str2 [2] = 0 et tout ira bien.


@ROBERTOCABONI Je pense que cela demandera un autre personnage de donner comme stdin?


Non liée: les caractères blancheurs de fin, tels que \ n in scanf () Les chaînes de format sont presque toujours fausses et Peut causer des ravages avec l'entrée utilisateur . Si vous souhaitez ignorer les caractèresWLINE, ajoutez un espace avant le % c (c.-à-d. "% c" ) après un appel précédent sur scanf () .


@Vishnucs non, ça ne le fera pas. Ce que Scanf attend ne dépend pas de la taille de la matrice que vous écrivez, mais uniquement sur le format:% C attrape un caractère uniquement.


@Robertocaboni true.


3 Réponses :


3
votes

Le code de travail sera comme xxx

correction 1:

non lié: des caractères d'espace de fuite tels que \ n dans scanf () - @ ex_nihilo déjà donné un commentaire à ce sujet.

Fix 2:

espace avant% c supprime tout espace blanc (blancs, tabs ou nouvelles)

Fix 3:

Si STR2 est une chaîne, le caractère final doit être '\ 0' et nous devons l'ajouter explicitement. Pour cela, nous devons augmenter la taille de la matrice STR2 à 3.


2 commentaires

C'est bon, fournir Vous ne voulez pas pouvoir entrer dans un espace pour l'un des caractères de str2 .


scanf ("% s", str); est mauvais comme obtient (str); Utilisez une limite de largeur comme scanaf ("% 99s", STR);



0
votes

Si STR2 est la chaîne la plupart de la fin avec \ 0 et la longueur de la transmission doit être 3 .

look: xxx

aussi vous ne devez pas ajouter ce \ n à votre scanf car lorsque vous appuyez sur Entrée, il passera automatiquement à la ligne suivante, Mais lorsque vous ajoutez \ n à scanf (après les données), il attendra quelque chose à l'exception de la nouvelle ligne ou de la nouvelle place blanche à terminer.


2 commentaires

Pourquoi ST2 de longueur 3 est-il alors que le caractère nul est stocké à STR2 [2]?


@Gauravkumar point sur les matrices est que, ils sont indexés de 0, donc lorsque str2 est 3 .IT signifie qu'il a 3 éléments, qui sont a [0] et a [1] et A [2] (3 éléments n'incluent jamais a [3] )



1
votes

Lorsque j'imprime ma chaîne, il imprime plus que la longueur de sa longueur

code n'a pas essayé d'imprimer un string .

printf ("% s", str2); nécessite str2 pour être un string . STR [2] n'est pas un String car il manque un caractère null . Le résultat est comportement non défini (UB).

Pour imprimer un tableau de caractères similaire à une chaîne , même s'il manque un Null caractère < / em>, utilisez un précision . L'impression s'arrête lorsque la précision ou un caractère null est atteint. xxx

alternativement, assurez-vous que str2 [] contient un caractère null et imprimez comme avant.


0 commentaires