2011-01-20 128 views
6

我在聲明一個字符串變量時遇到了一些麻煩。代碼和錯誤在這裏:http://pastebin.com/TEQCxpZd任何想法我做錯了什麼?另外,請保持平臺獨立。謝謝!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

是什麼給了你'輸入= scanf`的想法是有效的? – GManNickG 2011-01-20 05:02:51

+0

可能來自Pascal,您可以在不使用`()`的情況下調用函數。 – dan04 2011-01-20 05:45:32

+0

奇怪的是,C++不是Pascal。 – GManNickG 2011-01-20 17:50:59

回答

5

你在混合C++和c I/O。在C++中,這是,

#include <string> 
#include <iostream> 

int main(void) 
{ 
    std::string input; 
    std::cin >> input; 
    std::cout << input; 
    return 0; 
} 
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 

你試圖將函數指針分配給scanf給一個字符串變量。你不能那樣做,這就是你得到第一個錯誤的原因。正確的語法是。

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

但這是一種非常C風格的做事方式。按照Nathan的建議,用C++讀取輸入的慣用方式是std::cin >> input

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

printf(input); //Print text 

printf需要const char*作爲第一個參數,而不是一個std::string。您可以使用.c_str()轉換爲C風格的字符串。但是從不將用戶輸入作爲第一個參數傳遞給printf;用戶可以通過將%放入字符串中來做噁心的事情。如果你堅持在C風格輸出,正確的語法是:

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

但C++ - 風格的選擇是std::cout << input;

1

我明白這個問題是:你如何在C++中進行字符串聲明? 這裏是一個簡短的程序來演示:

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

因此,包括cstdlib在程序的開始。實際上,這意味着輸入字符串而不是std :: string,而不是std :: cout等等。字符串變量本身(在本例中,字符串變量是your_name)用string聲明。

比方說,你已經保存程序的文件名,「str_example.cpp」 要在(在Linux)的命令行編譯程序:

g++ -o str_example str_example.cpp 

這將創建一個名爲str_example一個可執行目標文件(沒有文件擴展名)。 最後,假設你在同一個目錄下的程序是,運行它

./str_example 

的G ++手冊頁是廣泛的,但默認情況下不包括在內。要使用性向包管理器安裝克++文檔:

sudo apt-get install gcc-7-doc 

注意,「7」是指7版本;目前的版本在寫作時。希望有所幫助。