我是C ++的完全新手,但不是Java,C#,JavaScript,VB。我正在使用Visual Studio 2010中的默认C ++控制台应用程序。
在尝试做一个printf我得到一些奇怪的字符。每次都不一样,告诉我每次运行它时都会看到不同的内存位置。
代码:
#include "stdafx.h"
#include <string>
using namespace std;
class Person
{
public:
string first_name;
};
int _tmain(int argc, _TCHAR* argv[])
{
char somechar;
Person p;
p.first_name = "Bruno";
printf("Hello %s", p.first_name);
scanf("%c",&somechar);
return 0;
}
答案 0 :(得分:10)
问题是printf
/ scanf
不是类型安全的。您提供的std::string
对象printf
期望const char*
。
解决此问题的一种方法是编写
printf("Hello %s", p.first_name.c_str());
但是,由于您使用C ++进行编码,因此优先使用I / O流而不是printf
/ scanf
:
std::cout << p.first_name << std::endl;
std::cin >> c;
答案 1 :(得分:4)
将字符串转换为c字符串。
printf("Hello %s", p.first_name.c_str());
此外,由于您使用的是C ++,因此您应该了解cout而不是printf!
答案 2 :(得分:2)
使用printf("Hello %s",p.first_name.c_str());
!
答案 3 :(得分:2)
printf("Hello %s", p.first_name.c_str());
但是,如果您使用的是c ++,为什么不使用iostream?
答案 4 :(得分:2)
您无法将C ++ std::string
个对象传递到printf
。 printf
仅了解int
,float
和char*
等原始类型。你的编译器应在那里给你一个警告;如果不是,请提高你的警告水平。
由于您使用的是C ++,因此您应该使用std::cout
进行文本输出,这样可以理解std::string
个对象。如果您出于某种原因确实必须使用printf
,请通过调用std::string
方法将const char*
转换为c_str()
。
答案 5 :(得分:0)
printf("%s")
接受由'\0'
终止的c样式字符串。但是,string
对象是C ++对象,它与c风格的字符串不同。您应该使用重载的std::cout
直接处理string
类型,如下所示。
std::cout << p.first_name;