C++连接错误
C++ Concatenation Oops
所以我最近一直在从C++、C#和Java来回学习,并很好地编写了一些C++代码,我做了这样的事情。
string LongString = "Long String";
char firstChar = LongString.at(0);
然后尝试使用一种看起来像这样的方法,
void MethodA(string str)
{
//some code
cout << str;
//some more code }
以下是我如何实现的。
MethodA("1. "+ firstChar );
尽管在C#和Java中完全有效,但这在C++中做了一些奇怪的事情。
我期待类似的东西
//1.L
但在程序的后面,它给了我一些其他字符串文字的一部分。
我到底做了什么?
我应该注意的是,我已经纠正了这个错误,这样它就打印出了我所期望的,但我真的对我错误地做了什么感兴趣。
提前谢谢。
C++没有将字符串文字上的加法定义为串联。相反,字符串文字衰减到指向其第一个元素的指针;单个字符被解释为数值,因此结果是从程序只读内存段中的一个位置到另一个位置的指针偏移。
使用std::string
:将加法作为串联
MethodA(std::string() + "1. " + firstChar);
MethodA(std::string("1. ")+ firstChar );
自"1."是const-char[4]并且没有concat方法)
问题是"1. "
是一个字符串文字(字符数组),它将衰减为指针。字符本身是可以提升为int
的char
,并且const char*
和int
的相加被定义为通过将原始指针偏移那么多位置来计算新指针。
C++中的代码调用MethodA
,结果是将(int)firstChar
(字符的ASCII值)添加到字符串文字"1. "
中,如果firstChar
的值大于4(可能是),则这将是未定义的行为。
MethodA("1. "+ firstChar ); //your code
它是一种指针算术:它只向字符串文本"1. "
的地址添加一个整数值(firstChar
),然后将结果(char const*
类型)传递给函数,在函数中转换为string
类型。基于firstChar
的值,它可以调用未定义的行为事实上,在您的情况下,它确实调用了未定义的行为,因为生成的指针指向字符串文字之外
写下:
MethodA(string("1. ")+ firstChar ); //my code
C++中的字符串文字不是std::string
的实例,而是char
s的常量数组。因此,通过向其添加char
,一个隐式的强制转换为字符指针,然后按字符的数值递增,whick恰好指向存储在.data节中的另一个字符串文字。
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 从 Linux OMI (omicli) 到 Windows WMI 的连接失败,并出现与 DMTF 相关的错误
- C++ 中连接 4 游戏的输入逻辑错误
- Eclipse:错误:初始化模式失败(无法连接到目标)
- C++所有 AT 命令的短信返回错误 |PC<->通过蓝牙和winsocket的移动连接
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- Mongocxx 连接错误
- 连接到套接字失败 - 错误编号 88 (CPP)
- 尝试重新连接到服务器时获取错误提升 asio 连接超时
- 字符和 int 连接何时会导致 seg 错误?
- 在 ZeroMQ 中绑定订阅者套接字并连接发布者套接字会在代码运行时给出错误.为什么
- JNI - WMI 连接错误
- boost :: Asio连接错误的界面
- 如何在两个设备之间与TCP通信时修复错误"连接被拒绝"