3
int main(){
char palabra = "HOLA";
cout<<palabra;
}

por que al ejecutar eso me manda el error invalid conversion from 'const char*' to 'char' [-fpermissive] ¿Esta mal que lo haga asi?

  • Posiblemente esta pregunta en la misma plataforma te sirva pues creo es de lo mismo https://es.stackoverflow.com/questions/96510/invalid-conversion-from-char-to-const-char – BetaM Nov 20 '19 at 00:04

4 Answers4

7

por que al ejecutar eso me manda el error invalid conversion from 'const char*' to 'char' [-fpermissive] ¿Esta mal que lo haga asi?

Te da ese error porqué la variable palabra fue declarado como tipo char, esto quiere decir que la variable sólo podrá guardar un caracter.

Por ejemplo, este código no dará error de compilación:

#include <iostream>

int main(void)
{
    char letra = 'H'; //sin error.
    std::cout << letra;
    return 0;
}

Solución:

#include <iostream>

int main(void)
{
    const char* palabra = "Hola"; //sin error.
    std::cout << palabra;
    return 0;
}

En este caso no dará error de compilación porqué el puntero palabra es de tipo const char* y la cadena literal Hola también es de tipo const char*, por lo tanto, no hay ningún error de conversión.

Ahora, ¿que pasaría si le quito el const al puntero palabra?

Dará la siguiente advertencia si lo compilamos con G++ de GNU:

warning: forbids converting a string constant to char*

Esto ocurre porqué la cadena literal Hola es sólo de lectura, es decir, no lo puedes modificar en tiempo de ejecución, entonces si escribes el siguiente código:

char* palabra = "Hola";

El compilador g++ dará un warning porqué le estás dando la oportunidad al puntero palabra de modificar la cadena literal Hola. Así que por seguridad, es recomendable agregarle el const antes del asterisco, de ese modo, no podrás usar el puntero para desreferenciar, por ejemplo:

const char* palabra = "Hola";
palabra[0] = 'L'; //error

Dará error de compilación porqué no puedes usar el puntero palabra para modificar ningún elemento de la cadena.

También recalco que todo dependerá del compilador. Por ejemplo, el compilador cl.exe no produce ninguna advertencia y si te deja modificar la cadena literal en tiempo de ejecución.

MrDave1999
  • 7,491
  • 1
  • 7
  • 22
  • 1
    Eso de _"No puedes modificar en tiempo de ejecución"_ no es del todo cierto todo depende de si acaba en una región de solo lectura o en una normal... como digo depende del compilador y del Sistema Operativo. Si realmente no pudiese ser modificado no te daría un warning sino un error – eferion Nov 20 '19 at 06:53
4
int main(){
    char palabra = "HOLA";
    cout<<palabra;
}

¿Por qué al ejecutar eso me manda el error invalid conversion from 'const char*' to 'char'?

Porque un escalón no es una escalera:



Porque un eslabón no es una cadena:


Porque una perla no es un collar de perlas:


Por lo tanto un carácter char no es una cadena de caracteres char *

H no es HOLA


En una palabra entre comillas dobles (como por ejemplo "HOLA") es un literal de cadena de caracteres. Los literales de cadena de caracteres tienen como tipo const char[tamaño] (dependiendo de cómo se escriba el literal puede ser const wchar_t[tamaño] u otros tipos de caracteres) es decir: formación de caracteres de tamaño tamaño.

Las formaciones (del tipo que sean) pueden ser transformadas implícitamente a puntero; por lo tanto una formación de tipo const char[5] se puede transformar implícitamente a un puntero const char *.

Por lo tanto, cuando escribes el siguiente código, el compilador interpreta:

char palabra = "HOLA";
  1. Crea un objeto d tipo char con nombre palabra.
  2. Crea una formación de tipo const char[5] con el contenido 'H', 'O', 'L', 'A', '\0'.
  3. Iguala palabra a la formación.
    1. Dado que la formación es un valor de lado derecho, convierte a puntero.
    2. Convierte el puntero al primer elemento de la formación a char.
    3. ¡Error! const char * no es convertible a char.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
1

mejor usa el tipo de dato "string", es mejor para lo que necesitas

mal

int main(){
char palabra = "HOLA";
cout<<palabra;
}

Bien

int main(){
string palabra = "HOLA";
cout<<palabra;
}
1

Como andas? Las variables de tipo char almacenan un caracter. Para almacenar un conjunto de caracteres ( string ) Podes usar

        `
#include<iostream>
#include<string.h>

using namespace std;

int main(){
   string palabra = "hola";
   char * palabra2 = "Hola";
   cout << palabra << endl;
   cout << palabra2 << endl;

   return 0;
}`

Con cualquiera de esas dos. Espero que te haya servido, abrazo!

Joaquin Ruiz
  • 138
  • 5