天道酬勤,学无止境

converting an array of null terminated const char* strings to a std::vector< std::string >

问题

我有一个 Visual Studio 2008 C++ 函数,其中给定了一个以空字符结尾的字符串数组const char*和该数组中的字符串数。

我正在寻找一种巧妙的方法将const char*数组转换为std::vector< std::string >

/// @param count - number of strings in the array
/// @param array - array of null-terminated strings
/// @return - a vector of stl strings
std::vector< std::string > Convert( int count, const char* array[] );

Boost很好,STL很好。

回答1
vector< string > ret( array, array + count );
回答2
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>


int main(int argc,char* argv[])
{
    // Put it into a vector
    std::vector<std::string>    data(argv, argv + argc);

    // Print the vector to std::cout
    std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
回答3
#include <algorithm>
#include <iterator>
#include <string>
#include <vector>

std::vector<std::string> Convert(int count, const char **arr)
{
    std::vector<std::string> vec;
    vec.reserve(count);
    std::copy(arr, arr+count, std::back_inserter(vec));
    return vec;
}

int main()
{
    const char *arr[3] = {"Blah", "Wibble", "Shrug"};
    std::vector<std::string> vec = Convert(3, arr);
    return 0;
}
回答4
std::vector< std::string > Convert( int count, const char* array )
{
   std::vector< std::string > result;

   for(const char* begin = array; count; --count)
   {
    const char* end = begin;
    for(; *end; ++end);
    result.push_back(std::string(begin, end));
    begin = end + 1;
   }

   return result;
}
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • converting an array of null terminated const char* strings to a std::vector< std::string >
    I have a Visual Studio 2008 C++ function where I'm given an array of null-terminated strings const char* and a count of the number of strings in that array. I'm looking for a clever way of turning an array of const char* in to a std::vector< std::string > /// @param count - number of strings in the array /// @param array - array of null-terminated strings /// @return - a vector of stl strings std::vector< std::string > Convert( int count, const char* array[] ); Boost is fine, STL is fine.
  • std :: string转换为char *(std::string to char*)
    问题 我想将std :: string转换为char *或char []数据类型。 std::string str = "string"; char* chr = str; 结果为: “错误:无法将'std :: string'转换为'char'...” 。 有什么方法可以做到这一点? 回答1 它不会自动转换(感谢上帝)。 您必须使用方法c_str()来获取C字符串版本。 std::string str = "string"; const char *cstr = str.c_str(); 注意,它返回一个const char * ; 您不允许更改c_str()返回的C样式字符串。 如果要处理它,则必须先复制它: std::string str = "string"; char *cstr = new char[str.length() + 1]; strcpy(cstr, str.c_str()); // do stuff delete [] cstr; 或在现代C ++中: std::vector<char> cstr(str.c_str(), str.c_str() + str.size() + 1); 回答2 在此处和此处有更多详细信息,但您可以使用 string str = "some string" ; char *cstr = &str[0]; 回答3
  • 将未知长度的char**(c)转换为向量 (c++) [重复](Convert char** (c) of unknown length to vector<string> (c++) [duplicate])
    问题
  • 在 C++ 中将字符串向量转换为字符数组(Convert string vector to char array in c++)
    问题 我正在尝试将字符串向量转换为 C++ 中的字符数组。 更具体地说,我想要做的是使用以下命令拆分像“ls –latr”这样的shell命令: istringstream f(x); while (getline(f, x, ' ')) { strings.push_back(x); } 我相信这会给我strings[0] == "ls"和strings[1]==" -latr" 。 我正在尝试执行以下操作: execvp(strings[0], strings); 但是,我收到此错误: 错误:无法将参数 '1' 的 'std::basic_string, std::allocator >' 转换为 'const char*' 到 'int execvp(const char*, char* const*)' 因此,我试图弄清楚如何将字符串转换为字符数组。 回答1 阅读手册显示“ execvp提供了一个指向空终止字符串的指针数组”。 所以你需要创建这样一个数组。 这是一种方法: std::vector<char *> argv(strings.size() + 1); // one extra for the null for (std::size_t i = 0; i != strings.size(); ++i) { argv[i] = &strings[i][0]; }
  • 从向量转换时 execvp 不起作用矢量字符**(execvp not working when converting from vector<string> to vector<char*> to char**)
    问题 从字符串向量到 char* 向量到 char**,当参数作为 char** 传入时正在工作,但转换似乎有问题,我无法找到差异。 有一个更好的方法吗? vector<string> args; /* code that correctly parses args from user input */ pid_t kidpid = fork(); if (kidpid < 0) { perror("Internal error: cannot fork."); return -1; } else if (kidpid == 0) { // I am the child. vector<char*>argcs; for(int i=1;i<args.size();i++) { char * temp = new char[args.at(i).length()]; for(int k=0;k<args.at(i).length();k++) { temp[k] = args.at(i).at(k); } argcs.push_back(temp); } char** argv = new char*[argcs.size() + 1]; for (int i = 0; i < argcs.size(); i++) { argv[i] = argcs[i]; } argv[args
  • 转换向量转换为char ** C ++(convert vector<string> into char** C++)
    问题 我有一个vector<std::string>变量。 我需要将其传递给接受char**作为输入参数的方法。 这该怎么做 ? 如果可能的话,我需要通过一个可写的。 更新1:在用于创建服务方法的工具中,我将参数指定为std :: vector,但会自动将限定符设置为&,这意味着该工具生成的方法定义将如下所示: std::string SvcImpl::myMethodname ( const std::string par1, const std::vector< std::string >& par2, const std::vector< std::string >& par3 ) { } 通过传递的参数中的值自动调用此方法。 现在,从此方法内部,我将在lib文件夹中的dll中调用一个方法,如下所示: int method_to_be_called(char* par1, char ** par2, char ** par3, void* pRetValue); 对于par1->我正在传递(char *)par1.c_str() 我需要知道如何为par2和par3以及pRetValue传递变量。 向量中可以使用par2和par3的值,但是最后一个参数pRetValue是输出参数,我需要将其作为std :: string返回。 对不起,如果我感到困惑或提出非常基本的问题。
  • C++ 转换向量到第一个向量字节为 0 的字符串(C++ Converting Vector<BYTE> to string where first vector byte is 0)
    问题 我正在尝试将 BYTES(或无符号字符)的 std::vector 转换为 std::string。 我遇到的问题是当向量的第一个元素为 0 时,转换后返回一个空字符串。 我已经尝试了以下两种方法。 string1 和 string2 都返回一个空字符串。 我期望的结果是一个以 2 x 0 开头的字符串,后跟其他几个字符。 // vector of BYTE, contains these 7 elements for example: (0,30,85,160,155,93,0) std::vector<BYTE> data; // method 1 BYTE* pByteArray = &data[0]; std::string string1 = reinterpret_cast<LPCSTR>(pByteArray); // method 2 std::string string2(data.begin(),data.end()); // both string1 and string2 return "" 我猜是因为向量中的第一个 BYTE 是 0,所以字符串赋值认为它是 null 或空的。 为了返回字符串的其余部分,我可以做一些其他的转换吗? 非常感谢任何帮助。 回答1 第二个不是真的空请考虑: // vector of BYTE, contains these
  • 将十六进制字符串转换为字节数组(Converting a hex string to a byte array)
    问题 将可变长度的十六进制字符串(例如"01A1"转换为包含该数据的字节数组的最佳方法是什么。 即转换此: std::string = "01A1"; 进入这个 char* hexArray; int hexLength; 或这个 std::vector<char> hexArray; 这样,当我将其写入文件并hexdump -C ,我将获得包含01A1的二进制数据。 回答1 这应该起作用: int char2int(char input) { if(input >= '0' && input <= '9') return input - '0'; if(input >= 'A' && input <= 'F') return input - 'A' + 10; if(input >= 'a' && input <= 'f') return input - 'a' + 10; throw std::invalid_argument("Invalid input string"); } // This function assumes src to be a zero terminated sanitized string with // an even number of [0-9a-f] characters, and target to be sufficiently
  • 如何转换向量变成一个字符串? [复制](How to transform a vector<int> into a string? [duplicate])
    问题 这个问题已经在这里有了答案: 将vector <int>转换为字符串(22个答案) 5年前关闭。 我正在尝试将值从C ++传递给TCL。 由于不使用某些复杂的模块就无法传递指针,因此我正在考虑将向量转换为char数组,然后将其作为以null终止的字符串传递(相对容易)。 我有一个向量,如下所示: 12, 32, 42, 84 我想将其转换为: "12 32 42 48" 我正在考虑的方法是使用迭代器遍历向量,然后将每个整数转换为其字符串表示形式,然后将其添加到char数组中(该字符数组最初是通过传递向量的大小而动态创建的)。 这是正确的方法还是已经有执行此功能的功能? 回答1 关于什么: std::stringstream result; std::copy(my_vector.begin(), my_vector.end(), std::ostream_iterator<int>(result, " ")); 然后可以从result.str().c_str()传递指针 回答2 您可以将copy与stringstream对象和ostream_iterator适配器结合使用: #include <iostream> #include <sstream> #include <string> #include <vector> #include <algorithm> using
  • Char数组转换为十六进制字符串C ++(Char array to hex string C++)
    问题 我在char*之前搜索了hex字符串,但是发现实现在hex字符串的末尾添加了一些不存在的垃圾。 我从套接字收到数据包,我需要将它们转换为hex字符串以记录日志(以空终止的缓冲区)。 有人可以建议我C++的良好实现吗? 谢谢! 回答1 假设数据为char *。 使用std :: hex的工作示例: for(int i=0; i<data_length; ++i) std::cout << std::hex << (int)data[i]; 或者,如果您想将所有内容都保留在字符串中: std::stringstream ss; for(int i=0; i<data_length; ++i) ss << std::hex << (int)data[i]; std::string mystr = ss.str(); 回答2 这里是一些东西: char const hex_chars[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; for( int i = data; i < data_length; ++i ) { char const byte = data[i]; string += hex_chars[ ( byte & 0xF0 ) >> 4
  • 将 Haskell ByteStrings 转换为 C++ std::string(Convert Haskell ByteStrings to C++ std::string)
    问题 我想将 Haskell 中的严格ByteStrings转换为 C++ 的std::string以通过 FFI 将其传递给 C++ 库。 由于ByteString可能包含NULL字符,因此将转换为CString作为中间步骤是不可行的。 这里的正确方法是什么? 当前解决方案 感谢您到目前为止的答案。 我希望该任务有一个规范的解决方案,但也许它还不存在:) 一些 c++ 库文档说明如下: 字符串 ( const char * s, size_t n ); 内容被初始化为由 s 指向的字符数组中的前 n 个字符形成的字符串的副本。 因此,可以编写这样一个函数,它从 ByteString 复制一次以构造 std::string foreign import ccall unsafe toCCString_ :: CString -> CUInt -> IO (Ptr CCString) toCCString :: ByteString -> IO (Ptr CCString) toCCString bs = unsafeUseAsCStringLen bs $ \(cstring,len) -> toCCString_ cstring (fromIntegral len) 伴随toCCString_的 C++ 代码看起来就像 Neil 和 Alan 指出的那样。 回答1
  • 如何将CString和std :: string std :: wstring相互转换?(How do you convert CString and std::string std::wstring to each other?)
    问题 CString非常方便,而std::string与STL容器更兼容。 我正在使用hash_map 。 但是, hash_map不支持CString作为键,因此我想将CString转换为std::string 。 编写CString哈希函数似乎需要很多时间。 CString -----> std::string 我怎样才能做到这一点? std::string -----> CString: inline CString toCString(std::string const& str) { return CString(str.c_str()); } 我对吗? 编辑: 这里有更多问题: 如何从wstring转换为CString ,反之亦然? // wstring -> CString std::wstring src; CString result(src.c_str()); // CString -> wstring CString src; std::wstring des(src.GetString()); 这有什么问题吗? 此外,如何从std::wstring转换为std::string ,反之亦然? 回答1 根据CodeGuru: CString到std::string : CString cs("Hello"); std::string s((LPCTSTR)cs)
  • 如何将字符串转换为 char * 数组(How to convert string into char * array)
    问题
  • 如何将std :: string转换为const char *或char *?(How to convert a std::string to const char* or char*?)
    问题 如何将std::string转换为char*或const char* ? 回答1 如果您只想将std :: string传递给需要const char*的函数,则可以使用 std::string str; const char * c = str.c_str(); 如果要获取可写副本,例如char * ,则可以执行以下操作: std::string str; char * writable = new char[str.size() + 1]; std::copy(str.begin(), str.end(), writable); writable[str.size()] = '\0'; // don't forget the terminating 0 // don't forget to free the string after finished using it delete[] writable; 编辑:请注意,以上内容并非异常安全。 如果在new呼叫和delete呼叫之间发生任何故障,您将泄漏内存,因为没有任何东西会自动为您呼叫delete 。 有两种直接的方法可以解决此问题。 boost :: scoped_array 当超出范围时,boost :: scoped_array将为您删除内存: std::string str; boost::scoped
  • 使用 strlen() 查找字符串数组的长度(Find the length of string array with strlen())
    问题
  • 逗号分隔标记的向量到 const char**(Vector of comma separated token to const char**)
    问题 我正在尝试将逗号分隔的字符串转换为 const char* 的向量。 使用以下代码,预期的输出是 ABC_ DEF HIJ 但我明白了 HIJ DEF HIJ 我哪里错了? 代码: #include <iostream> #include <boost/tokenizer.hpp> #include <vector> #include <string> using namespace std; int main() { string s("ABC_,DEF,HIJ"); typedef boost::char_separator<char> char_separator; typedef boost::tokenizer<char_separator> tokenizer; char_separator comma(","); tokenizer token(s, comma); tokenizer::iterator it; vector<const char*> cStrings; for(it = token.begin(); it != token.end(); it++) { //cout << (*it).c_str() << endl; cStrings.push_back((*it).c_str()); } std::vector<const char*>
  • C++ Knowledge in Coding Interview (面试常用C++知识和技巧)
    C++ Knowledge in Coding Interview Some useful C++ knowledge and examples that may be used/asked in a coding interviewFor more articles like this, please visit https://medium.com/@yangpeng_tech Table of Contents Variables definitions, assignments, and initiationsType conversionsPointerObject-Oriented ProgrammingSTLOther common usagesExplanation of keywords Variables definitions, assignments and initializations Uniform initializations Integers int a; int a = 5; int a(5); int a{5}; Char char c; c = 'a'; c = 97; // same as c = 'a'; cout << c will print 'a' as well. char c = 'a'; char c('a'); char
  • 如何将char *复制到字符串中,反之亦然(how to copy char * into a string and vice-versa)
    问题 如果我将 char * 传递给函数。 然后我想将该 char * 转换为 std::string ,一旦我得到结果,将其从 std::string 转换回 char * 以显示结果。 我不知道如何进行转换(我不是在说 const char * 而只是 char *) 我不确定如何操作我发送的指针的值。 所以我需要做的步骤 输入一个字符 * 将其转换为字符串。 获取该字符串的结果并将其以字符 * 的形式放回返回结果,以便该值应该在函数之外可用并且不会被破坏。 如果可能的话,我可以看到它是如何通过引用与指针完成的(我按值传入的地址但是我仍然可以修改指针指向的值。所以即使函数中指针地址的副本被破坏了我仍然看到外面的变化值。 谢谢! 回答1 将char*转换为std::string : char* c = "Hello, world"; std::string s(c); 将std::string转换为char* : std::string s = "Hello, world"; char* c = new char[s.length() + 1]; strcpy(c, s.c_str()); // and then later on, when you are done with the `char*`: delete[] c; 我更喜欢使用std::vector<char
  • 为什么不允许从字符数组初始化 std::string?(Why not allowing std::string initialization from array of chars?)
    问题 在 C++ 中,您可以从char *和const char *初始化std::string对象,这隐含地假定字符串将在指针之后找到的第一个NUL字符处结束。 然而,在 C++ 中,字符串文字是数组,即使字符串文字包含嵌入的NUL ,也可以使用模板构造函数来获得正确的大小。 例如,请参见以下玩具实现: #include <stdio.h> #include <string.h> #include <vector> #include <string> struct String { std::vector<char> data; int size() const { return data.size(); } template<typename T> String(const T s); // Hack: the array will also possibly contain an ending NUL // we don't want... template<int N> String(const char (&s)[N]) : data(s, s+N-(N>0 && s[N-1]=='\0')) {} // The non-const array removed as probably a lot of code // builds strings into char
  • Convert char** (c) of unknown length to vector<string> (c++) [duplicate]
    This question already has answers here: converting an array of null terminated const char* strings to a std::vector< std::string > (4 answers) copying c array of strings into vector of std::string (4 answers) Closed 9 years ago. How would one go about converting a C char** to a C++ vector? Is there some built-in functionality one can utilize to do this, or is it better to accomplish it through a series of iterative steps? EDIT: For various reasons, the number of elements in the C array is unknown. It is possible I could pass that as another parameter, but is that absolutely necessary?