0
votes

Spécification de la taille de la matrice pour une chaîne d'entrée d'utilisateur en C imbriété?

J'écris un code pour saisir l'entrée d'un utilisateur du terminal comme chaîne. J'ai lu en ligne que la bonne façon d'instancer une chaîne en C est d'utiliser un tableau de caractères. Ma question est de savoir si j'instaine une matrice de taille [10], est-ce que 10 index? 10 bits? 10 octets? Voir le code ci-dessous: xxx

dans cet exemple "STR" est initialisé à la taille 10 et je suis capable d'imprimer STR [15] en supposant que lorsque l'utilisateur entrait la chaîne AA à cet indice.

Mes questions sont:

  1. Est-ce que la taille de l'augmentation de la matrice "str" ​​après avoir pris une valeur de Scanf?
  2. à quelle quantité de caractères de chaîne mon réseau d'origine aura-t-il débordement? .

7 commentaires

Vous appelez comportement indéfini avec printf ("% c \ n", str [15]); - tout peut arriver dans ce cas


Dupliqué possible de Pas d'erreur de sortie


Vous devriez lire un bon tutoriel sur la matrice et l'utilisation des chaînes dans C. Peut-être surprenant, C n'a pas de type "chaîne" de première classe, vous devez donc souvent manipuler les caractères individuels vous-même et il y a un certain nombre de règles que vous doivent suivre.


Il s'agit de 10 index, de 0 à 9 . Les chaînes, par définition, sont des matrices avec un élément de valeur '\ 0' (ou simplement 0 ), de sorte que les caractères maximaux que votre matrice peut avoir est de 9 (0 à 9 Personnages + le 0 élément)


Je sais que les index sont de 0 à 9 mais je suis confus pourquoi c me permet de saisir des caractères plus grands que la taille de la matrice 10. Dites que je saisis "ABCDEFGHIJK", qui correspond à 11 caractères et j'écris "printf ("% s \ n ", str);" Ensuite, la chaîne entière est imprimée, aucune question hors limites. Pourquoi donc?


L'une des voies UB soulève sa tête laid est en faisant ce que vous espérez ... sauf sur la pleine lune mercredis


C est un outil très efficace pour son objectif, pas un coffre-fort. Tout comme une tronçonneuse est. Votre manque d'erreur est due à cela.


3 Réponses :


1
votes

Lorsque vous déclarez un tableau de Char code> comme vous l'avez fait:

scanf("%9s", str);


2 commentaires

Cela a beaucoup aidé. Merci. Donc, fondamentalement, cela peut fonctionner mais ce n'est pas la mise en œuvre la plus sûre / fiable. J'ai deux autres questions pour la clarté: 1. Si je prends une entrée d'utilisateur, il y a un moyen de rendre mon tableau de la même taille que leur entrée sans déclarant la taille de la matrice en premier? 2. Quelle serait la taille maximale d'un tableau de caractères C?


@Kaasimshaikh ne le pense jamais mai travail! Cela ne fonctionnera pas, aussi simple que cela. Sur vos autres points, déclarez la taille de la matrice pour être la longueur maximale (raisonnable) que votre utilisateur voudrait pour la chaîne! La norme C ne définit pas une taille maximale (je pense - mais peut-être que cela), comme tel, mais votre compilateur / constructeur et / ou votre système d'exploitation peut échouer si vous essayez de le déclarer comme (dire) 6 milliards.



1
votes

L'un des documents drôles de C de C est que dans presque tous les cas, il ne pas vérifie que vous ne déborde pas de vos tableaux.

C'est votre travail pour vous assurer de ne pas accéder à l'extérieur des limites de vos tableaux, et si vous le faites accidentellement, presque tout peut arriver. (Officiellement, c'est comportement indéfini .)

À propos de la seule chose qui ne peut pas arriver, c'est que vous obtenez un bon message d'erreur

Erreur: Array Out-Binds Accès à la ligne 23

(Bien, théoriquement que pourrait-il se produire, mais dans la pratique, pratiquement aucun contrôle de mise en œuvre de la mise en œuvre de la matrice limite des violations ou des messages tels que celui-ci.)

Voir aussi Cette réponse à une question similaire.


0 commentaires

1
votes

Un tableau déclare le nombre donné de tout ce que vous déclarez. Donc, dans le cas de: xxx

vous déclarez une matrice de dix char s.

  1. Est-ce que la taille de l'augmentation de la matrice "str" ​​après avoir pris une valeur de Scanf?

    Non, la taille ne change pas.

    1. à quelle quantité de caractères de chaîne mon tableau d'origine aura-t-il débordement?

      Un tableau de 10 Char S tiendra neuf caractères et le terminateur NULL. Donc, techniquement, il limite la chaîne à neuf caractères. xxx

      Ce code références du 16ème caractère de votre tableau. Étant donné que votre tableau contient seulement dix caractères, vous accédez à la mémoire en dehors du tableau. Toute personne devine que si votre programme possède même cette mémoire et, si c'est le cas, vous référencez une mémoire qui fait partie d'une autre variable. Ceci est une recette pour la catastrophe.


0 commentaires