6

このコードに実行時エラーがあるのはなぜですか?

#include <cstdio>
#include <map>
#include <string>
#include <iostream>

using namespace std;
map <int, string> A;
map <int, string>::iterator it;

int main(){
    A[5]="yes";
    A[7]="no";
    it=A.lower_bound(5);
    cout<<(*it).second<<endl;    // No problem
    printf("%s\n",(*it).second); // Run-time error
    return 0;
}

cout を使用すると、問題なく動作します。ただし、printf を使用すると実行時エラーが発生します。どうすれば修正できますか? ありがとう!

4

2 に答える 2

10

std::stringaを期待するものに a を渡していchar *ます ( のドキュメントからわかるようにprintf、これはクラスを持たない C 関数であり、ましてやstring)。基になる の const バージョンにアクセスするには、次の関数char *を使用します。c_str

printf("%s\n",(*it).second.c_str());

また、(*it).secondは と同等ですit->secondが、後者の方が入力しやすく、私の意見では、何が起こっているのかがより明確になります。

于 2012-11-07T01:23:45.497 に答える
3

使用c_str():

printf("%s\n",(*it).second.c_str());

printf()には C 文字列が%s必要ですが、代わりに C++ 文字列を指定しています。printf()タイプセーフではないため、これを診断する方法はありません (ただし、優れたコンパイラはこのエラーについて警告する場合があります) 。

于 2012-11-07T01:23:58.257 に答える