2011-01-20 13 views
6

Tengo problemas para declarar una variable de cadena. El código y los errores están aquí: http://pastebin.com/TEQCxpZd ¿Alguna idea de lo que estoy haciendo mal? Además, manténgalo independiente de la plataforma. ¡Gracias!C++ String Variable Declaration

#include <stdio.h> 
#include <string> 
using namespace std; 

int main() 
{ 
    string input; //Declare variable holding a string 

    input = scanf; //Get input and assign it to variable 
    printf(input); //Print text 
    return 0; 
} 


Getting this from GCC: 

main.cpp: In function ‘int main()’: 
main.cpp:53:10: error: invalid conversion from ‘int (*)(const char*, ...)’ to ‘char’ 
main.cpp:53:10: error: initializing argument 1 of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’ 
main.cpp:54:14: error: cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int printf(const char*, ...)’ 
+2

¿Qué le dio la idea 'input = scanf' era válida? – GManNickG

+0

Posiblemente desde Pascal, donde puede llamar a una función sin el '()'. – dan04

+0

Eso es extraño, C++ no es Pascal. – GManNickG

Respuesta

5

Está mezclando C++ y c I/O. En C++ esto es,

#include <string> 
#include <iostream> 

int main(void) 
{ 
    std::string input; 
    std::cin >> input; 
    std::cout << input; 
    return 0; 
} 
+0

Ahora recibo este error: http://pastebin.com/GuEVJ3FY – Mike

+1

@Mike: ¿Ha incluido el encabezado iostream? '#include ' Además, probablemente debería estar usando g ++ para compilar programas C++, en lugar de gcc. –

+0

Incluí iostream. El problema estaba en la terminal. Tuve que escribir g ++ main.cpp -o hello_world en lugar de gcc. Gracias cody! – Mike

2

cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int printf(const char*, ...)’

input = scanf; //Get input and assign it to variable 

usted está tratando de asignar el puntero de función a scanf a una variable de cadena. No puedes hacer eso, y es por eso que estás obteniendo el primer error. La sintaxis correcta sería.

char buffer[BIG_ENOUGH_SIZE]; 
scanf("%*s", sizeof(buffer) - 1, buffer); 
input = buffer; 

Pero esa es una forma muy de estilo C de hacer las cosas. La manera idiomática de leer la entrada en C++ es con std::cin >> input, como sugirió Nathan.

cannot convert ‘std::string’ to ‘const char*’ for argument ‘1’ to ‘int printf(const char*, ...)’

printf(input); //Print text 

printf toma un const char* como primer argumento, no una std::string. Puede usar .c_str() para convertir a una cadena de estilo C. Pero nunca ingrese la entrada del usuario como primer argumento a printf; el usuario puede hacer cosas desagradables al poner % en la cadena. Si insiste en la salida de estilo C, la sintaxis correcta es:

printf("%s", input.c_str()); 

Pero el C++ - estilo alternativo es std::cout << input;.

+0

Bueno, ni siquiera puedo compilar Hello World correctamente. Creo que algo está mal con el compilador, si el código es correcto o no, sé que no hay nada de malo en #include usando namespace std; int main() { \t cout << "¡Hola, mundo!" << endl; \t return 0; } – Mike

+0

Lo que parece más interesante aquí es que cuando se construye bajo MSVC, la conversión implícita de std :: string a const char * tiene éxito pero no cuando se compila con GCC. Me imagino que esto se debe a que la implementación de MSVC de std :: string contiene un operador de conversión para const char * mientras que la implementación de GCC no? –

1

Entiendo que la pregunta es: ¿Cómo se hace una declaración de cadena en C++? Aquí es un programa corto para demostrar:

#include<iostream> 
#include<cstdlib> 
using namespace std; 
int main() 
{ 
    string your_name; 
    cout << "Enter your name: "; 
    cin >> your_name; 
    cout << "Hi, " << your_name << "!\n"; 
    return 0; 
} 

Por lo tanto, incluyen cstdlib en el inicio de su programa. En términos prácticos, esto significa escribir cadena en lugar de std :: string, cout en lugar de std :: cout y así sucesivamente. La variable de cadena en sí (en el ejemplo, la variable de cadena es your_name) se declara con cadena.

Digamos que ha guardado el programa con el nombre del archivo, 'str_example.cpp' Para compilar el programa en la línea de comandos (en Linux):

g++ -o str_example str_example.cpp 

Esto crea un archivo objeto ejecutable llamado str_example (sin extensión de archivo). Y, por último, suponiendo que está en el mismo directorio que el programa, para ejecutarlo:

./str_example 

La página del manual de g ++ es extensa pero no está incluido por defecto. Para instalar la documentación de g ++ usando aptitude package manager:

sudo apt-get install gcc-7-doc 

Tenga en cuenta que el '7' se refiere a la versión 7; la versión actual al momento de escribir. Espero que ayude.