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

您将 a 传递std::string给期望 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 回答