Error raro en la compilación de este sencillo código.

Iniciado por OmarHack, 7 Junio 2013, 17:25 PM

0 Miembros y 2 Visitantes están viendo este tema.

OmarHack

A ver si me podéis echar una mano con este código.
Lo que quiero es que ejecute una acción si las letras introducidas por teclado (qw) coinciden con las especificadas en el if.

Podría hacer un arreglo de 3 caracteres que almacenara "qw" y compararlo con "palabra" pero voy a incluir muchísimas combinaciones de letras y tendría que declarar muchísimos arreglos, con este código me ahorraría cientos de lineas y el código sería más legible pero en la linea del "if" me da el error:
CitarISO C++ forbids comparison between pointer and integer

También me salta un warning pero, ¿creo que solo me avisa de que estoy comparando una variable con una constante no?
Citarmulti-character character constant


Código (cpp) [Seleccionar]
#include <iostream>
char palabra[20];      
int main() {            
std::cout << "introduce letras";    
std::cin >> palabra;
if (palabra == 'qw')
{std::cout <<"\nHola mundo";}
getchar();            
getchar();            
return 0;}



Aquí el código comentado:
Código (cpp) [Seleccionar]
#include <iostream> //Incluir biblioteca entrada salida.
char palabra[20];      //Cadena de caracteres global.
int main() {             //Funcion principal.
std::cout << "introduce letras";    //Muestra el texto.
std::cin >> palabra;//Recoge texto del teclado y se lo asigna a "palabra".
if (palabra == 'qw') //Si se introdujo por teclado "qw"
{std::cout <<"\nHola mundo";}  //muestra el texto.
getchar();            //No cierra hasta que se pulse enter.
getchar();               //No cierra hasta que se pulse enter.
return 0;}                   //Devuelve 0 a la funcion.


PD: Poniéndolo así soluciono el warning:
Código (cpp) [Seleccionar]
if (palabra[20] == "qw")
Pero me sigue dando el mismo error.
I like to test things.

pacoperico

#1
En tu codigo palabra no es una variable sino una constante apuntador es decir, el nombre de un arreglo es un puntero de tipo constante y que apunta al primer elemento del arreglo, palabra es lo mismo que &palabra[0].

El arreglo palabra[] declaralo como de tipo string a ver que tal.

pacoperico

#2
Cita de: OmarHack en  7 Junio 2013, 17:25 PM
PD: Poniéndolo así soluciono el warning:
Código (cpp) [Seleccionar]
if (palabra[20] == "qw")
Pero me sigue dando el mismo error.

No estas comparando el arreglo palabra[] con "qw", estas comparando el elemento numero 20 del arreglo palabra[] con "qw"


Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
std::string palabra;     
int main() {           
std::cout << "introduce letras";   
std::cin >> palabra;
if (palabra == "qw")
{std::cout <<"\nHola mundo";}
getchar();           
getchar();           
return 0;
}

CCross

#3
El error se debe a que estas intentando comparar un puntero con un entro y esto esta
prohibido lo mejor para estos casos es usar la funcion strcmp quedaria asi:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>

int main() {
   char palabra[20]= {0};

   std::cout << "introduce letras: ";
   std::cin >> palabra;

   if(strcmp(palabra, "qw")==0)
   std::cout <<"\nHola mundo";
   std::cin.get();

   return 0;}


Saludos  ;D

OmarHack

Cita de: CCross en  7 Junio 2013, 17:51 PM
El error se debe a que estas intentando comparar un puntero con un entro y esto esta
prohibido lo mejor para estos casos es usar la funcion strcmp quedaria asi:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstring>

int main() {
    char palabra[20]= {0};

    std::cout << "introduce letras: ";
    std::cin >> palabra;

    if(strcmp(palabra, "qw"))
    std::cout <<"\nHola mundo";
    std::cin.get();

    return 0;}


Saludos  ;D
Gracias!
Hace justo lo contrario, si pongo por teclado qw no sale el texto, y si pongo otra cosa cualquiera si sale. ¿Cómo lo soluciono? Voy a mirar el uso de esa librería a ver que hace xD.
I like to test things.

maxim_o

#5
Si estas usando c++, por que no usas string?


Código (cpp) [Seleccionar]

#include <string>
#include <iostream>
using namespace std;
int main() {
string palabra;
cout << "introduce letras";
cin >> palabra;
if (palabra == "qw")
{
   cout <<"\nHola mundo";
}
return 0;
}







CCross

#6
Cita de: OmarHack en  7 Junio 2013, 18:00 PM
Hace justo lo contrario, si pongo por teclado qw no sale el texto, y si pongo otra cosa cualquiera si sale. ¿Cómo lo soluciono?
Disculpame se me escapo un detallito he editado el codigo de arriba ahora funciona
Saludos  ;)

OmarHack

Cita de: CCross en  7 Junio 2013, 18:06 PM
Disculpame se me escapo un detallito he editado el codigo de arriba ahora funciona

Saludos  ;)
Muchas gracias! Ya lo arreglara yo también así:
Código (cpp) [Seleccionar]
if(strcmp(palabra, "qw") == 0)
    {std::cout <<"\nHola mundo";}
:)

Cita de: maxim_o en  7 Junio 2013, 18:04 PM
Si estas usando c++, por que no usas string?


Código (cpp) [Seleccionar]

#include <string>
#include <iostream>
using namespace std;
int main() {
string palabra;
cout << "introduce letras";
cin >> palabra;
if (palabra == "qw")
{
    cout <<"\nHola mundo";
}
return 0;
}


¿Tan fácil? Pues no lo conocía, no hace mucho que uso cadenas de carácteres y en los dos cursos que estoy viendo (en c++) usaban "char palabra[20]"
¿Si quiero comparar por ejemplo la 3 letra de una cadena con la 4 de otra tengo que usar un for no? ¿O puedo hacerlo de alguna manera similar a esta: "palabra[2]"?

Muchas gracias a todos :)

I like to test things.

amchacon

Cita de: OmarHack en  7 Junio 2013, 18:19 PM¿O puedo hacerlo de alguna manera similar a esta: "palabra[2]"?
Puedes usar el operador [] sin problemas

Un ejemplo de uso de strings:

Código (cpp) [Seleccionar]
string Texto = "Cosita Linda";

Texto = "ABCDEFGHIJKLMNOPQRTST"; //Operador de asignacion, funciona incluso aunque la cadena sea mas grande que la anterior

Texto += "Otra cadena"; // Operador + para concatenar cadenas

cout<<Texto.size(); // La funcion size te indica el tamanyo de la cadena

if (Texto == "Esto") // Operador ==

cout<<Texto[0]; // Obtienes el primer caracter
cout<<Texto[1]; // obtienes el segundo caracter

//...
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

maxim_o

#9
Código (cpp) [Seleccionar]

#include <string>
#include <iostream>
using namespace std;

int main(){

string palabra;
cout<< "Dame dos letras";
cin>>palabra;

cout<<palabra[0]; // primera letra
cout << palabra[1]; //primera letra
cout<<palabra.length(); //tamaño total
}


Se puede usar sin problemas igual....

Edito: Vale ya te lo habían resuelto.
Saludos