2011-01-20 17 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

あなたは 'input = scanf'が有効であるという考えを与えましたか? – GManNickG

+0

おそらく '()'を使わずに関数を呼び出せるPascalからです。 – dan04

+0

これは奇妙なことですが、C++はPascalではありません。 – GManNickG

答えて

5

C++とc I/Oを混在させています。 C++では、これは、

#include <string> 
#include <iostream> 

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

これでエラーが発生しました:http://pastebin.com/GuEVJ3FY – Mike

+1

@Mike:iostreamヘッダーは含まれていますか? '#include 'また、g ++ではなくg ++を使ってC++プログラムをコンパイルしているはずです。 –

+0

私はiostreamを含んでいました。問題は、gccの代わりにg ++ main.cpp -o hello_worldと入力しなければならないという問題でした。ありがとうございました! – 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 

であるあなたは、文字列変数に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その最初の引数ではなく、std::stringとしてconst char*を取ります。 .c_str()を使用して、Cスタイルの文字列に変換できます。しかし、決してprintfの最初の引数としてユーザー入力を渡します。ユーザーは%を文字列に入れて、厄介なことをすることができます。あなたはCスタイルの出力を主張する場合は、正しい構文は次のとおりです。

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

しかし、C++ - スタイルの選択肢はstd::cout << input;です。

+0

まあ、私はHello Worldを正しくコンパイルできません。私は何かがコンパイラに間違っていると思うコードが正しいかどうか、私は何も間違っていることを知っているか分からない #include using namespace std; int main() { \t cout << "Hello World!" << endl; \t return 0; } – Mike

+0

ここで興味深いのは、MSVCの下でビルドするときに、std :: stringからconst char *への暗黙的キャストは成功しますが、GCCでコンパイルした場合は成功しません。これはMSVCのstd :: stringの実装にconst char *のキャスト演算子が含まれているためですが、GCC実装ではそうではありません。 –

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の代わりにstringを、std :: coutの代わりにcoutをタイプすることを意味します。文字列変数自体(この例では、文字列変数はyour_nameです)はstringで宣言されています。

(Linuxの場合)コマンドラインでプログラムをコンパイルするには「str_example.cpp」 、あなたはファイル名のプログラムを保存したとしましょう:

g++ -o str_example str_example.cpp 

これはstr_exampleと呼ばれる実行可能オブジェクトファイルを作成します(ファイル拡張子なし)。 そして最後に、それを実行するために、あなたがプログラムと同じディレクトリにいると仮定すると:

./str_example 

グラムの++のmanページが広範囲が、デフォルトで含まれていません。 aptitudeパッケージマネージャを使用してg ++のドキュメントをインストールするには:

sudo apt-get install gcc-7-doc 

「7」はバージョン7を表します。現在のバージョンは、書面の時に。希望が役立ちます。