ISO C++ forbids comparaison entre pointeur et entier [-fpermissive]| [c++]
Je suis en train de compiler le code suivant sur Ubuntu (64-bit), avec Code::Blocks 10.05 que les IDE:
#include <iostream>
using namespace std;
int main() {
char a[2];
cout << "enter ab ";
cin >> a;
if (a == 'ab') //line 7
{
cout << "correct";
}
return 0;
}
Sur la ligne 7, mon compilateur me donne l'erreur "ISO C++ forbids comparaison entre pointeur et entier [-fpermissive]".
Pourquoi ne pas ce travail? Je sais que je pourrais utiliser un std::string
pour contourner le problème, mais je veux comprendre le problème actuel.
notez que
'ab'
est un int, alors que "ab"
est un tableau de caractères.
OriginalL'auteur Thunfische | 2012-02-14
Vous devez vous connecter pour publier un commentaire.
char a[2]
définit un tableau dechar
'.a
est un pointeur vers la mémoire au début du tableau et à l'aide de==
ne sera pas réellement comparer le contenu dea
avec'ab'
parce qu'ils ne sont pas vraiment les mêmes types,'ab'
est de type entier. Aussi'ab'
devrait être"ab"
sinon vous aurez des problèmes ici aussi. Pour comparer des tableaux de char vous voulez les utiliser strcmp.Quelque chose qui pourrait être utile est à la recherche à la
typeid
de'ab'
:sur mon système retourne:
montrant que
'ab'
est réellement évalué comme un int.Si vous deviez faire la même chose avec un std::string alors vous seriez en traitant avec une classe et une std::string a
operator ==
surcharge et faire une comparaison vérifier lors de l'appelle de cette façon.Si vous voulez comparer l'entrée avec la chaîne "ab" dans un idiomatiques c++ façon, je vous suggère de le faire comme ceci:
a
est un tableau, comme vous avez pu le voir avecsizeof(a)
), et non le problème.Je pense que je l'ai dit, je pense que la mise en forme est un peu déroutant ici.
Édité, je l'espère rend les choses plus claires.
Je pensais qu'il n'y a pas de différence entre un char[13124]; et une chaîne;
un std::string est en fait une classe qui contient une chaîne de caractères. Les avantages d'utiliser un std::string comprennent pas avoir à trop s'inquiéter de la représentation interne ou la gestion de la mémoire les données sous-jacentes. De ce fait, il est plus facile d'écrire sans erreur de code et vous aide également à être plus productif que vous n'avez pas à dépenser autant de temps à vous soucier des petits détails.
OriginalL'auteur shuttle87
Celle-ci est due à:
if(a=='ab')
, ici,a
estconst char*
type (c'est à dire : tableau de char)'ab'
est une valeur constante,ce qui n'est pas évalué en tant que chaîne de caractères (à cause de l'apostrophe), mais seront évalués en entier.Depuis
char
est un type primitif hérité de C, l'opérateur n'a pas==
est défini.le bon code devrait être:
if(strcmp(a,"ab")==0)
, alors vous allez comparer unconst char*
à l'autreconst char*
à l'aide destrcmp
.strcmp( a, "ab" )
ne peut pas retourner0
.a
a typechar[2]
, de sorte que le plus long C chaîne de style qu'elle peut contenir est de 1 caractère. Rien de plus, et vous avez un comportement indéfini.en effet,l'une doit être d'au moins 3 char longtemps pour être en mesure de contenir final NUL char de la chaîne.Cependant, le compilateur alignement de stockage de ce 2 tableau d'octets peut entraîner 0 remplissant le adjacents 2 octets de la mémoire de la variable a, ainsi , rendre le code "travail" en dépit du programmeur d'erreur.
Je comprends.Merci beaucoup
Rembourrage pouvez vous enregistrer ici. Jusqu'à ce que l'utilisateur s'appuie sur la touche espace avant de faire son entrée. Première règle de saisie: attendre quoi que ce soit, même si ce n'est pas raisonnable. (Et le second est toujours de permettre attaque et de fuite des blancs de l'espace. Les gens ne accidentellement appuyé sur la touche espace, de temps à autre, et si c'est au début ou à la fin, ils ne le voient pas.)
OriginalL'auteur dweeves