2011-01-20 3 views
6

J'ai des problèmes pour déclarer une variable chaîne. Code et les erreurs sont ici: http://pastebin.com/TEQCxpZd Des pensées sur ce que je fais mal? Aussi, s'il vous plaît gardez-le indépendant de la plate-forme. Merci!Déclaration de variable chaîne C++

#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'est-ce qui vous a donné l'idée que 'input = scanf' était valide? – GManNickG

+0

Peut-être à partir de Pascal où vous pouvez appeler une fonction sans le '()'. – dan04

+0

C'est étrange, C++ n'est pas Pascal. – GManNickG

Répondre

5

Vous confondez C++ et c E/S. En C++ cela est,

#include <string> 
#include <iostream> 

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

Je reçois maintenant cette erreur: http://pastebin.com/GuEVJ3FY – Mike

+1

@Mike: Avez-vous inclus l'en-tête iostream? '#include ' De plus, vous devriez probablement utiliser g ++ pour compiler des programmes C++ plutôt que gcc. –

+0

J'ai inclus iostream. Le problème était dans le terminal que je devais taper g ++ main.cpp -o hello_world au lieu de gcc. Merci 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 

Vous essayez d'assigner le pointeur de fonction -scanf à une variable de chaîne. Vous ne pouvez pas faire cela, c'est pourquoi vous obtenez la première erreur. La syntaxe correcte serait.

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

Mais c'est une façon de faire les choses. La manière idiomatique de lire l'entrée en C++ est avec std::cin >> input comme suggéré par Nathan.

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

printf(input); //Print text 

printf prend un const char* comme premier argument, pas std::string. Vous pouvez utiliser .c_str() pour convertir en une chaîne de style C. Mais jamais passer l'entrée de l'utilisateur en tant que premier argument à printf; l'utilisateur peut faire des choses méchantes en mettant % dans la chaîne. Si vous insistez sur la sortie C de style, la syntaxe correcte est:

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

Mais le C++ - autre style est std::cout << input;.

+0

Eh bien, je ne peux même pas compiler Hello World correctement. Je pense que quelque chose ne va pas avec le compilateur, que le code soit correct ou pas, je sais qu'il n'y a rien de mal avec #include using namespace std; int main() { \t cout << "Bonjour tout le monde!" << endl; \t return 0; } – Mike

+0

Ce qui semble plus intéressant ici est que lors de la construction sous MSVC, la conversion implicite de std :: string en const char * réussit mais n'a pas lieu lors de la compilation avec GCC. J'imagine que c'est parce que l'implémentation MSVC de std :: string contient un opérateur cast pour const char * alors que l'implémentation de GCC ne le fait pas? –

1

Je comprends que la question soit: Comment faites-vous une déclaration de chaîne en C++? Voici un programme court pour démontrer:

#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; 
} 

Ainsi, comprennent cstdlib au début de votre programme. En termes pratiques, cela signifie que vous devez saisir une chaîne au lieu de std :: string, cout au lieu de std :: cout et ainsi de suite. La variable de chaîne elle-même (dans l'exemple, la variable de chaîne est your_name) est déclarée avec une chaîne.

Disons que vous avez enregistré le programme avec le nom du fichier, « str_example.cpp » Pour compiler le programme à la ligne de commande (sous Linux):

g++ -o str_example str_example.cpp 

Cela crée un fichier objet exécutable appelé str_example (pas d'extension de fichier). Et enfin, en supposant que vous êtes dans le même répertoire que le programme, pour l'exécuter:

./str_example 

La page de manuel pour g ++ est vaste mais pas inclus par défaut. Pour installer la documentation g ++ à l'aide du gestionnaire de paquets aptitude:

sudo apt-get install gcc-7-doc 

Notez que le '7' fait référence à la version 7; la version actuelle au moment de l'écriture. J'espère que cela pourra aider.