我想在控制台中显示C ++ String
的值 - 但是特定的String
没有独立定义 - 它是另一种类型的变量的属性...我目前正试图用它来显示它的值是:
printf("\n CSARSixSectorItem.cpp line 530. rm_WPSequence[liSARIndex -1]: %s", rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name);
在引号之外,我将变量rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name
传递给%s
中的printf
。
m_Name
是String类型的变量,定义为:
std::string m_Name;
rm_RefPointDB
是指向CGenericRefPoint
的指针,定义为:
CGenericRefPoint * rm_RefPointDB;
和rm_WPSequence是vector
定义的:
vector< CUserWaypointListElement > rm_WPSequence;
但是,虽然我尝试显示的实际变量是string
,但是当在控制台中打印行时,我没有给出字符串的内容,但是有一些不可读的字符,例如{ {1}} ...每次打印行时,显示的字符都会更改。我想知道这是因为L,%
是另一个变量的成员吗?如果是这样,我如何显示String的值?我真的不想知道它的父变量,但是我还需要做些什么才能自己访问String?
答案 0 :(得分:2)
使用std string的c_str()函数传递给%s:
printf("\n CSARSixSectorItem.cpp line 530. rm_WPSequence[liSARIndex -1]: %s", rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name.c_str());
说明:%s期望显示char *类型。您正在传递一个std :: string,它是Class Type。
c_str()返回一个指向std :: string包含的char *缓冲区的指针。
答案 1 :(得分:0)
使用std::string
的{{1}}格式打印printf
时,您应使用%s
c_str()
方法,如下所示:
std::string
您正在使用C风格的输出方式rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name.c_str()
,因此应使用C风格的参数来打印字符串。
c_str()
是printf
的成员函数。它返回一个指向数组的指针,该数组包含一个numm终止的字符序列,表示字符串对象的当前值。这是包含名称字符串字符的实际std::string
数组。这是字符串的C风格,
对于这个问题,最新的稳定版本的编译器会给你一个错误。注意这些可以节省你的大量时间。
对于以下测试代码,clang ++和g ++都会出错。对于char
函数调用,它们不允许将non-POD
对象作为...
传递。
printf
Clang ++输出
#include <string>
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
string a("This is a string");
printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
cout << a << endl;
return 0;
}
g ++输出
$ clang++ Stringcstring.cpp
Stringcstring.cpp:26:32: error: cannot pass non-POD object of type 'string' (aka 'basic_string<char>') to
variadic function; expected type from format string was 'unsigned int' [-Wnon-pod-varargs]
printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
~~ ^
Stringcstring.cpp:26:35: error: cannot pass non-POD object of type 'string' (aka 'basic_string<char>') to
variadic function; expected type from format string was 'char *' [-Wnon-pod-varargs]
printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
~~ ^
Stringcstring.cpp:26:35: note: did you mean to call the c_str() method?
printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
^
.c_str()
Stringcstring.cpp:26:39: warning: format specifies type 'unsigned int' but the argument has type
'string *' (aka 'basic_string<char> *') [-Wformat]
printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
~~ ^~
1 warning and 2 errors generated.
您的对象,$ g++ Stringcstring.cpp
Stringcstring.cpp: In function ‘int main()’:
Stringcstring.cpp:26:41: error: cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string<char>}’ through ‘...’
printf("0x%x, 0x%s, 0x%x\n", a, a , &a);
^
Stringcstring.cpp:26:41: error: cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string<char>}’ through ‘...’
Stringcstring.cpp:26:41: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 4 has type ‘std::string* {aka std::basic_string<char>*}’ [-Wformat=]
是rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name
类的对象。对于std::string
的{{1}}格式,它接受的只是printf
的数组,或者它会尝试将%s
内存中的char
对象解释为std::string
,这就是为什么你看到一些无意义的字符输出。