使用 std::string::operator+= 函数作为参数时出现段错误
SegFault while using std::string::operator+= with function as param
我知道当指针分配 memory/misdirection 不充分时会发生分段错误。
#include <iostream>
using namespace std;
const char *hex(char);
int main(int argc, char **argv)
{
string url = "start http://www.cplusplus.com/search.do?q=";
char a[2];
for (int i = 0; i < argc; i++)
{
if (i != 1)
url += '+';
for (int j = 0; argv[i][j]; j++)
{
if (i == 1 && j == 0 && argv[i][j] == '.')
continue;
url += '%';
// a[0] = argv[i][j] / 16;
// a[1] = argv[i][j] % 16;
// for (int k = 0; k < 2; k++)
// {
// if (a[k] > 9)
// a[k] += 'A' - 10;
// else
// a[k] += '0';
// url += a[k];
// }
url += hex(argv[i][j]);
}
}
system(url.c_str());
return 0;
}
const char *hex(char c)
{
char h = {c / 16, c % 16, '[=11=]'};
for (int k = 0; k < 2; k++)
if (h[k] > 9)
h[k] += 'A' - 10;
else
h[k] += '0';
return h;
}
但是对于这段代码,它应该像 url 对传递的参数进行编码的命令一样工作,但是对于字符串 class 的运算符 += 存在问题。我在调试器中跟踪它并且函数 hex 正常工作(returns hexValue of char c)。
但是在这一行,url += hex(argv[i][j]);
由于某种原因存在段错误,argv[i][j] 是 char 和 hex() returns 它的十六进制值以 const cstring 的形式存在(const字符 *)。我什至在末尾添加了一个空字符,如果它有什么不同...
我什至检查了 std::string 引用以确保运算符接受 const char*(但这很明显,否则会出现编译错误,我遇到过 none)。
有什么猜测吗?顺便说一句,注释代码替代了函数式代码并且可以完美运行,当然在 Windows 上。
非常感谢任何建议,因为如果这个函数有效,它会使这个位更加便携,我知道可能有 url 编码的库函数,但这只是练习。
你的 hex
函数正在返回一个临时局部变量的地址,这是一个大问题,所以当内存被重新使用时它会在那里崩溃。
当该函数 returns h
超出范围 立即 ,因此任何指向 h
的指针都将失效。
由于您使用的是 C++,因此只需使用 std::string
:
std::string hex(const char c)
{
std::string h = {c / 16, c % 16, '[=10=]'};
for (int k = 0; k < 2; k++)
if (h[k] > 9)
h[k] += 'A' - 10;
else
h[k] += '0';
return h;
}
另外,与其重新发明轮子,不如考虑使用 std::hex
to do this for you as demonstrated here.
之类的东西
我知道当指针分配 memory/misdirection 不充分时会发生分段错误。
#include <iostream>
using namespace std;
const char *hex(char);
int main(int argc, char **argv)
{
string url = "start http://www.cplusplus.com/search.do?q=";
char a[2];
for (int i = 0; i < argc; i++)
{
if (i != 1)
url += '+';
for (int j = 0; argv[i][j]; j++)
{
if (i == 1 && j == 0 && argv[i][j] == '.')
continue;
url += '%';
// a[0] = argv[i][j] / 16;
// a[1] = argv[i][j] % 16;
// for (int k = 0; k < 2; k++)
// {
// if (a[k] > 9)
// a[k] += 'A' - 10;
// else
// a[k] += '0';
// url += a[k];
// }
url += hex(argv[i][j]);
}
}
system(url.c_str());
return 0;
}
const char *hex(char c)
{
char h = {c / 16, c % 16, '[=11=]'};
for (int k = 0; k < 2; k++)
if (h[k] > 9)
h[k] += 'A' - 10;
else
h[k] += '0';
return h;
}
但是对于这段代码,它应该像 url 对传递的参数进行编码的命令一样工作,但是对于字符串 class 的运算符 += 存在问题。我在调试器中跟踪它并且函数 hex 正常工作(returns hexValue of char c)。
但是在这一行,url += hex(argv[i][j]);
由于某种原因存在段错误,argv[i][j] 是 char 和 hex() returns 它的十六进制值以 const cstring 的形式存在(const字符 *)。我什至在末尾添加了一个空字符,如果它有什么不同...
我什至检查了 std::string 引用以确保运算符接受 const char*(但这很明显,否则会出现编译错误,我遇到过 none)。
有什么猜测吗?顺便说一句,注释代码替代了函数式代码并且可以完美运行,当然在 Windows 上。
非常感谢任何建议,因为如果这个函数有效,它会使这个位更加便携,我知道可能有 url 编码的库函数,但这只是练习。
你的 hex
函数正在返回一个临时局部变量的地址,这是一个大问题,所以当内存被重新使用时它会在那里崩溃。
当该函数 returns h
超出范围 立即 ,因此任何指向 h
的指针都将失效。
由于您使用的是 C++,因此只需使用 std::string
:
std::string hex(const char c)
{
std::string h = {c / 16, c % 16, '[=10=]'};
for (int k = 0; k < 2; k++)
if (h[k] > 9)
h[k] += 'A' - 10;
else
h[k] += '0';
return h;
}
另外,与其重新发明轮子,不如考虑使用 std::hex
to do this for you as demonstrated here.