从字符串中获取char*或constchar*数据中断16个或更长的字符串
我有一个函数string_to_char(),它试图给我一个字符串形式,我可以将它传递到我正在使用的库中,它想要char *(但我认为与 一起使用const char *,所以我一直在尝试两者)。
我编写的用于测试我的实现的代码string_to_char()如下:
#include <iostream>
const std::string endl = "n";
char * string_to_char(std::string str)
{
return (char*) str.c_str();
}
int main()
{
std::string test1 = "Some test strin";
std::string test2 = "Some test string";
char * result1 = string_to_char(test1);
char * result2 = string_to_char(test2);
std::cout << "part1" << endl;
std::cout << result1 << endl;
std::cout << string_to_char(test1) << endl;
std::cout << "part2" << endl;
std::cout << result2 << endl;
std::cout << string_to_char(test2) << endl;
std::cout << "done" << endl;
return 0;
}
这是我得到的输出:
part1
Some test strin
Some test strin
part2
Some test string
done
因此,出于某种原因,string_to_char()只能正确处理 15 个或更短字符的字符串,并从函数直接输出到 std::cout,但似乎无法将其存储到 16 个字符或更长时间的变量中。
我对 C++ 比较陌生,所以下面的一些代码对于更有经验的程序员来说可能看起来有点奇怪,但这里是我尝试过的代码来代替 return (char*) str.c_str();
#include <vector>
#include <string.h>
char * string_to_char(std::string str)
{
return (char*) str.c_str();
return const_cast<char*>(str.c_str());
std::vector<char> vec(str.begin(), str.end());
char * chr;
vec.push_back(' ');
chr = (char*) &vec[0];
//chr = & (*vec.begin());
return chr; //all outputs from both are empty with this both versions of chr
return &str[0]; //this makes the output from the 15 character string also be empty when put in a
//variable, but the function going directly to std::cout is fine
return strcpy((char *) malloc(str.length() + 1), str.c_str()); //this one works with everything, but
//it looks like it leaks memory without further changes
std::vector<char> copied(str.c_str(), str.c_str() + str.size() + 1);
return copied.data(); //returns "random" characters/undefined behaviour for both outputs in test1 and is empty for both
//outputs in test2
}
const改为使用,并更改char * result1 = string_to_char(test1);为const char * result1 = string_to_char(test1);(与result2),以查看是否适用于这些其他解决方案:
#include <vector>
#include <string.h>
const char * string_to_char(std::string str)
{
return (char*) str.c_str();
return str.c_str();
return (const char*) str.c_str();
return str.data();
return const_cast<char*>(str.c_str());
std::vector<char> vec(str.begin(), str.end());
char * chr;
vec.push_back(' ');
chr = (char*) &vec[0];
//chr = & (*vec.begin());
return chr; //completely breaks both
return &str[0]; //both appear empty when given to a variable, but works fine when taken straight to std::cout
return strcpy((char *) malloc(str.length() + 1), str.c_str()); //memory leak, as when not using const
std::vector<char> copied(str.c_str(), str.c_str() + str.size() + 1);
return copied.data(); //same as when not using const
}
我得到了很多给定的方法:
std::string 到 char*
string.c_str() 是常量吗?
如何将 std::string 转换为 const char* 或 char*?
在 C++ 中从 std::string 转换为 char *
在https://www.cplusplus.com/reference/和https://en.cppreference.com/w/上阅读一些关于字符串和向量的主题
回答
返回的指针c_str()仅在字符串存在时才有效。传递引用时,您会得到预期的输出:
auto string_to_char(std::string& str)
{
return str.c_str();
}
因为现在返回的指针进入了调用者字符串的缓冲区。在您的代码中,调用者获得一个指向函数本地字符串的指针(因为您传递了一个副本)。
但是,您可以直接调用c_str(). 这也减轻了在字符串延伸到一定程度后保持指针的问题。
- One can also avoid casting by calling `std::string::data`.