[英]c++ How do I print the value of a String attribute of a variable of another type?
我想在控制台中显示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
给printf
的%s
。
m_Name
是String类型的变量,定义为:
std::string m_Name;
rm_RefPointDB
是一个指向CGenericRefPoint
,具有限定:
CGenericRefPoint * rm_RefPointDB;
和rm_WPSequence是一个定义的vector
:
vector< CUserWaypointListElement > rm_WPSequence;
但是,虽然我试图显示的实际变量是一个string
,但是当在控制台中打印该行时,我没有给出字符串的内容,但是一些不可读的字符,例如L,%
......字符每次打印行时显示更改。 我想知道这是否因为String
是另一个变量的成员? 如果是这样,我如何显示String的值? 我真的不想知道它的父变量,但是我还需要做些什么才能自己访问String?
使用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。
c_str()返回一个指向std :: string包含的char *缓冲区的指针。
使用printf
的%s
格式打印std::string
,应该使用std::string
c_str()
方法,如下所示:
rm_WPSequence[liSARIndex-1].rm_RefPointDB->m_Name.c_str()
您使用的是C风格的输出方式printf
,因此应使用C风格的参数来打印字符串。
c_str()
是std::string
的成员函数。 它返回一个指向数组的指针,该数组包含一个numm终止的字符序列,表示字符串对象的当前值。 这是保存名称字符串字符的实际char
数组。 这是字符串的C风格,
对于这个问题,最新的稳定版本的编译器应该会给你一个错误。 注意这些可以节省你的大量时间。
对于以下测试代码代码,clang ++和g ++都会出错。 它们不允许将non-POD
对象传递为...
用于printf
函数调用。
#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;
}
Clang ++输出
$ 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 ++输出
$ 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
类的对象。 对于printf
的%s
格式,它接受的只是一个char
数组,或者它会尝试将内存中的std::string
对象解释为char *
,这就是为什么你看到一些无意义的字符输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.