为什么这些字符串不会在 C++ 中连接?
Why won't these strings concatenate in C++?
我有一个用 C++ 编写的两个测试程序的示例。第一个工作正常,第一个错误。请帮我解释一下这是怎么回事。
#include <iostream>
#include <string>
#include <stdint.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
string randomStrGen(int length) {
static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
string result;
result.resize(length);
for (int32_t i = 0; i < length; i++)
result[i] = charset[rand() % charset.length()];
return result;
}
int main()
{
ofstream pConf;
pConf.open("test.txt");
pConf << "rpcuser=user\nrpcpassword="
+ randomStrGen(15)
+ "\nrpcport=14632"
+ "\nrpcallowip=127.0.0.1"
+ "\nport=14631"
+ "\ndaemon=1"
+ "\nserver=1"
+ "\naddnode=107.170.59.196";
pConf.close();
return 0;
}
打开'test.txt'写入数据,没问题。然而,这不是:
#include <iostream>
#include <string>
#include <stdint.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
string randomStrGen(int length) {
static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
string result;
result.resize(length);
for (int32_t i = 0; i < length; i++)
result[i] = charset[rand() % charset.length()];
return result;
}
int main()
{
ofstream pConf;
pConf.open("test.txt");
pConf << "rpcuser=user\n"
+ "rpcpassword="
+ randomStrGen(15)
+ "\nrpcport=14632"
+ "\nrpcallowip=127.0.0.1"
+ "\nport=14631"
+ "\ndaemon=1"
+ "\nserver=1"
+ "\naddnode=107.170.59.196";
pConf.close();
return 0;
}
第二个程序的唯一区别是 'rpcpassword' 已移至下一行。
matthew@matthew-Satellite-P845:~/Desktop$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:23:6: error: invalid operands of types ‘const char [14]’ and ‘const char [13]’ to binary ‘operator+’
+ "rpcpassword="
C++ 中的字符串文字 ("foo"
) 是 而非 类型的 string
;它是 const char[x]
类型,其中 x
是字符串文字的长度加 1。并且字符数组不能与 +
连接。但是,字符数组 可以 与 string
连接,结果是 string
,它可以进一步与字符数组连接。因此,"a" + functionThatReturnsString() + "b"
有效,但 "a" + "b"
无效。 (请记住 +
是左结合的;它首先应用于最左边的两个操作数,然后应用于结果和第三个操作数,依此类推。)
"rpcuser=user\nrpcpassword=" + randomStrGen(15) + "\nrpcport=14632"
组喜欢 ("rpcuser=user\nrpcpassword=" + randomStrGen(15)) + "\nrpcport=14632"
。此处,+
始终与 class 类型的参数一起使用,因此在重载解析后得到 std::string::operator+
。
"rpcuser=user\n" + "rpcpassword=" + randomStrGen(15)
组喜欢 ("rpcuser=user\n" + "rpcpassword=") + randomStrGen(15)
。在这种情况下,第一个 +
用于两个非 class 类型,因此它没有重载,并且语言没有为两个 const char []
值定义 +
。 (我来自旧的 C,所以我有点不只是将它们添加为 char *
s 并在运行时给你一个很好的 SIGSEGV。)
我有一个用 C++ 编写的两个测试程序的示例。第一个工作正常,第一个错误。请帮我解释一下这是怎么回事。
#include <iostream>
#include <string>
#include <stdint.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
string randomStrGen(int length) {
static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
string result;
result.resize(length);
for (int32_t i = 0; i < length; i++)
result[i] = charset[rand() % charset.length()];
return result;
}
int main()
{
ofstream pConf;
pConf.open("test.txt");
pConf << "rpcuser=user\nrpcpassword="
+ randomStrGen(15)
+ "\nrpcport=14632"
+ "\nrpcallowip=127.0.0.1"
+ "\nport=14631"
+ "\ndaemon=1"
+ "\nserver=1"
+ "\naddnode=107.170.59.196";
pConf.close();
return 0;
}
打开'test.txt'写入数据,没问题。然而,这不是:
#include <iostream>
#include <string>
#include <stdint.h>
#include <stdlib.h>
#include <fstream>
using namespace std;
string randomStrGen(int length) {
static string charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
string result;
result.resize(length);
for (int32_t i = 0; i < length; i++)
result[i] = charset[rand() % charset.length()];
return result;
}
int main()
{
ofstream pConf;
pConf.open("test.txt");
pConf << "rpcuser=user\n"
+ "rpcpassword="
+ randomStrGen(15)
+ "\nrpcport=14632"
+ "\nrpcallowip=127.0.0.1"
+ "\nport=14631"
+ "\ndaemon=1"
+ "\nserver=1"
+ "\naddnode=107.170.59.196";
pConf.close();
return 0;
}
第二个程序的唯一区别是 'rpcpassword' 已移至下一行。
matthew@matthew-Satellite-P845:~/Desktop$ g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:23:6: error: invalid operands of types ‘const char [14]’ and ‘const char [13]’ to binary ‘operator+’
+ "rpcpassword="
C++ 中的字符串文字 ("foo"
) 是 而非 类型的 string
;它是 const char[x]
类型,其中 x
是字符串文字的长度加 1。并且字符数组不能与 +
连接。但是,字符数组 可以 与 string
连接,结果是 string
,它可以进一步与字符数组连接。因此,"a" + functionThatReturnsString() + "b"
有效,但 "a" + "b"
无效。 (请记住 +
是左结合的;它首先应用于最左边的两个操作数,然后应用于结果和第三个操作数,依此类推。)
"rpcuser=user\nrpcpassword=" + randomStrGen(15) + "\nrpcport=14632"
组喜欢 ("rpcuser=user\nrpcpassword=" + randomStrGen(15)) + "\nrpcport=14632"
。此处,+
始终与 class 类型的参数一起使用,因此在重载解析后得到 std::string::operator+
。
"rpcuser=user\n" + "rpcpassword=" + randomStrGen(15)
组喜欢 ("rpcuser=user\n" + "rpcpassword=") + randomStrGen(15)
。在这种情况下,第一个 +
用于两个非 class 类型,因此它没有重载,并且语言没有为两个 const char []
值定义 +
。 (我来自旧的 C,所以我有点不只是将它们添加为 char *
s 并在运行时给你一个很好的 SIGSEGV。)