2011-01-20 11 views
6

Mam problem z deklarowaniem zmiennej łańcuchowej. Kod i błędy są tutaj: http://pastebin.com/TEQCxpZd Jakieś myśli o tym, co robię źle? Ponadto, proszę zachować niezależność od platformy. Dzięki!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

Co dało ci pojęcie "input = scanf" było ważne? – GManNickG

+0

Prawdopodobnie od Pascala, gdzie możesz wywołać funkcję bez '()'. – dan04

+0

To dziwne, C++ to nie Pascal. – GManNickG

Odpowiedz

5

Miksujesz C++ i c I/O. W C++ jest to,

#include <string> 
#include <iostream> 

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

Otrzymuję teraz ten błąd: http://pastebin.com/GuEVJ3FY – Mike

+1

@Mike: Czy zawierałeś nagłówek programu iostream? '#include ' Powinieneś także używać g ++ do kompilowania programów w C++ zamiast gcc. –

+0

Dołączyłem też iostream. Problem polegał na tym, że musiałem wpisać g ++ main.cpp -o hello_world zamiast gcc. Dzięki 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 

Starasz się przypisać wskaźnik funkcji do scanf do zmiennej łańcuchowej. Nie możesz tego zrobić, dlatego dostajesz pierwszy błąd. Właściwa składnia byłaby.

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

Ale to bardzo stylowy sposób robienia rzeczy. Idiomatyczny sposób odczytywania danych wejściowych w C++ jest zgodny z std::cin >> input, jak sugerował Nathan.

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

printf(input); //Print text 

printf zajmuje const char* jako pierwszy argument, a nie std::string. Możesz użyć .c_str(), aby przekonwertować na ciąg znaków w stylu C. Ale nigdy przekazać dane wprowadzane przez użytkownika jako pierwszy argument do printf; użytkownik może zrobić paskudne rzeczy, wstawiając % w ciągu znaków. Jeśli nalegać na wyjściu stylu C, poprawna składnia jest następująca:

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

Ale C++ - alternatywny styl jest std::cout << input;.

+0

Nie mogę nawet poprawnie skompilować Hello World. Myślę, że coś jest nie tak z kompilatorem, czy kod jest poprawny czy nie, Wiem, że nie ma nic złego w używaniu #include przy użyciu przestrzeni nazw std; int main() { \t cout << "Witaj, świecie!" << endl; \t return 0; } – Mike

+0

} To, co wydaje się bardziej interesujące, polega na tym, że podczas budowania pod MSVC niejawne rzutowanie ze std :: string na const char * kończy się sukcesem, ale nie jest, gdy kompiluje się z GCC. Wyobrażam sobie, że dzieje się tak dlatego, że implementacja std :: string MSVC zawiera operator cast dla const char *, podczas gdy implementacja GCC nie działa? –

1

Rozumiem pytanie: Jak utworzyć deklarację łańcuchową w C++? Oto krótki program wykazać:

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

Tak, to cstdlib na początku programu. W praktyce oznacza to wpisywanie ciągu znaków zamiast std :: string, cout zamiast std :: cout i tak dalej. Zmienna łańcuchowa sama w sobie (w przykładzie zmienna łańcuchowa jest twoją nazwą) jest zadeklarowana jako łańcuch.

Powiedzmy zapisaniu program z pliku „str_example.cpp” Aby skompilować program w wierszu polecenia (w systemie Linux):

g++ -o str_example str_example.cpp 

Stwarza to plik wykonywalny obiekt o nazwie str_example (bez rozszerzenia pliku). I wreszcie, zakładając, że jesteś w tym samym katalogu co program, aby go uruchomić:

./str_example 

Strona man dla g ++ jest szeroki, ale nie włączone domyślnie. Aby zainstalować dokumentację w języku g ++ za pomocą menedżera pakietów aptitude:

sudo apt-get install gcc-7-doc 

Należy pamiętać, że "7" odnosi się do wersji 7; aktualna wersja w chwili pisania. Nadzieja, która pomaga.