J'utilise donc cin pour prendre une entrée pour un tableau de caractères.

char mycroft[2];
    cin>>mycroft;
    cout<<mycroft;

Ça fonctionne bien. J'utilise maintenant cin pour prendre une entrée pour un tableau int:

 int mycroft[2];
    cin>>mycroft;
    cout<<mycroft;

Cependant, j'obtiens cette erreur que je ne comprends pas:

erreur: pas de correspondance pour 'operator >>' (les types d'opérandes sont 'std :: istream {aka std :: basic_istream}' et 'int [2]') |

Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas? De plus, mon professeur a dit qu'il était déconseillé de prendre des entrées en utilisant cin. Dans quelle mesure est-ce vrai?

-2
shivam13juna 21 avril 2017 à 09:00

3 réponses

Meilleure réponse

Vous avez mal compris le concept de char tableaux et int (et autres) tableaux.

Lorsque vous créez un char variable[x], vous réservez de l'espace en mémoire à x * 8 bits (longueur de char) et le langage le traite comme un espace continu. Pour terminer cette chaîne, vous devez mettre le caractère de fin '\0'. Le char mycroft[2] a 1 utilisable char (en théorie) avec un espace de 16 bits (2 * 8 bits) en mémoire.

En revanche, lorsque vous créez un int variable[x] vous réservez de l'espace mémoire à x * 32 bit (longueur de int) et malgré l'allocation continue par le système, le langage traite tous les {{X3 }} éléments individuellement. En bref, traitez-le comme un vrai tableau. Le int mycroft[2] a 2 éléments utilisables et prend 64 bits (2 * 32 bits) en mémoire.

Pour cette raison, cin fonctionne avec char directement (cin >> mycroft et cout << mycroft) et ne fonctionne pas et avec les autres tableaux (dans votre cas int) vous besoin d'y accéder individuellement (cin >> mycroft[position] et cout << mycroft[position]).

0
Akira 19 juil. 2017 à 07:51

Parce qu'un tableau de caractères peut signifier qu'il s'agit d'une chaîne de style C (s'il est terminé par zéro, c'est-à-dire que le dernier élément du tableau est zéro). Le std::cout et le std::cin les traitent de cette manière.

Un char[] peut être initialisé comme:

char mycroft[] = "Hello, World!";

Un int[] ne peut pas être initialisé de cette manière, c'est un tableau d'entiers. La raison pour laquelle votre professeur vous a dit que la prise d'entrée en utilisant std::cin n'est pas conseillée est que cela peut provoquer des débordements si vous l'utilisez d'une mauvaise manière. Dans votre premier exemple, le std::cin écrira tout depuis l'entrée dans un long tableau à deux éléments provoquant l'écrasement de la mémoire qui suit le char mycroft[2].

0
Akira 21 avril 2017 à 07:04

Vous avez probablement besoin de:

for(i=0; i<2; i++) 
{
   cin>>mycroft[i];
 ...
}
0
Jacob Seleznev 21 avril 2017 à 06:04