天道酬勤,学无止境

将未知长度的char**(c)转换为向量 (c++) [重复](Convert char** (c) of unknown length to vector<string> (c++) [duplicate])

问题
回答1
const char* arr[] = {"Hello", "Friend", "Monkey", "Face"}; std::vector<std::string> v(std::begin(arr), std::end(arr)); const char** p = arr; std::vector<std::string> v(p, p + 4);
回答2
char** c;
vector<string> v(c, c + 10);

将从给定范围的元素构造元素。 10 是这里的元素数

回答3
char* strings[] = {"aaa", "bbb", "ccc", "ddd"}; std::vector<std::string> v(strings, strings + 4); int len = sizeof(strings)/sizeof(char*); std::vector<std::string> v2(strings, strings + len);
回答4

这个单行代码对于捕获命令行参数很有用......

int
main(int argc, char ** argv)
{
  std::vector<std::string> arguments(argv, argv + argc);
}

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • C++ 向量到 Python 3.3(C++ vector to Python 3.3)
    问题 我想从 C++ 脚本中获取 python 列表,例如[1,2,3,4] 。 我写了 C++ 脚本,它返回一个向量。 如何在没有 SWIG/SIP/Cython/等的情况下连接末端? 将 C++ 编译为 .exe 或 elf 文件,然后从命令行调用,让 .exe 创建一个包含向量的 .txt 并用 python 读取它会更容易吗? 我的观点是,我只需要一个来自 C++ 的非常小的函数来对大量数据进行大量计算。 做到这一点的最不痛苦和最短的方法是什么? 编辑:举个例子。 Python 会给 C++ 提供一个文件名字符串(“foo.txt”),然后 C++ 将读取文件的上下文(200,000 行 x 300 列),计算缺失值,然后将每行缺失值的数量返回给 Python。 这会产生一个包含 200,000 个数字的列表。 两者之间如何进行这种通信? 为了完整起见,这就是我仍然想知道如何去做的事情: 将 python 文件名字符串传递给 C++ 在 C++ 中接收 python 字符串完成在 C++ 中创建向量将向量返回给 Python 在 Python 中接收向量 回答1 这现在可能没有实际意义,我在你的另一个问题上发布了类似的内容,但我已经针对 Python 3.3 和 C++ 而不是 Python 2.7 和 C 调整了这个版本。 如果您想取回 Python 列表对象
  • C++:将字符串转换为向量(C++: Convert string to a vector<double>)
    问题 我对 C++ 比较陌生,想将数字的字符字符串转换为双精度向量。 这些字符串将具有不同的长度,但它们的长度将始终是已知的。 例如: 我有一个名为 "myValue" 的char*字符串,它看起来像这样"0.5 0.4 1 5"并且具有已知长度length=4 。 我想将此字符串转换为双精度向量,如下所示: vector<double> Param并给我以下输出: Param[0]=0.5, Param[1]=0.4, Param[2]=1, Param[3]=5 回答1 您可以使用 std::stringstream 执行此操作。 我们将字符串存储到stringstream ,然后使用 while 循环从中提取double部分。 std::stringstream ss; std::vector<double> data; char numbers[] = "0.5 0.4 1 5"; ss << numbers; double number; while (ss >> number) data.push_back(number); 现场示例 由于我们使用的是标准容器,我建议使用std::string而不是char []然后我们可以更改 char numbers[] = "0.5 0.4 1 5"; 至 std::string numbers = "0.5 0.4 1 5";
  • C ++如何将char数组转换为字节向量(向量 )(C++ how to convert char array to vector of bytes (vector<byte>))
    问题 我有大量的字符 char myCharArray[] = { 0x9B,0x3E,0x34,0x87,0xFD,0x24,0xB4,0x64,0xBA,0x80,0x04,0xFD, 0xDF,0x23,0x41,0xEE,0x00,0x00,0x00,0x00,0xAC,0xF9,0x8F,0x00, ... } 如何将myCharArray转换为vector<byte> 回答1
  • 在 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]; }
  • 如何将浮点数转换为向量在 C++ 中?(How to convert float to vector<unsigned char> in C++?)
    问题 我阅读了将浮点向量转换为字节向量并返回,但它并没有帮助我解决我的问题。 我想将std::vector<unsigned char>转换回float 。 unsigned char* bytes = &(readRequestArray);上的行不起作用,上面的行我只打印字节。 如何转换回浮点数? class HCSR04: public ISensor { public: HCSR04(); HCSR04(int trigger, int echo); ~HCSR04(); float distanceCentimeters(); std::vector<unsigned char> readRequest(); } std::vector<unsigned char> HCSR04::readRequest() { float preCent = distanceCentimeters(); const unsigned char* bytes = reinterpret_cast<const unsigned char*>(&preCent); std::vector<unsigned char> buffer(bytes, bytes + sizeof(float)); for (int j = 0; j < buffer.size(); j++) { std
  • 计算充满向量的单元格中的唯一行(Count unique rows in a cell full of vectors)
    问题 我在 MATLAB 中有一个单元格,其中每个元素都包含一个不同长度的向量 例如 C = {[1 2 3], [2 4 5 6], [1 2 3], [6 4], [7 6 4 3], [4 6], [6 4]} 如您所见,一些向量是重复的,其他向量是唯一的。 我想计算每个向量出现的次数并返回计数,以便我可以在 GUI 中填充表,其中每一行都是唯一的组合,日期显示每个组合出现的次数。 例如 Count "[1 2 3]" 2 "[6 4]" 2 "[2 4 5 6]" 1 "[7 6 4 3]" 1 "[4 6]" 1 我应该说每个向量中数字的顺序很重要,即 [6 4] 与 [4 6] 不同。 有什么想法我可以相当有效地做到这一点吗? 感谢到目前为止发表评论的人。 正如@Divakar 好心指出的那样,我忘了提到向量中的值可以超过一位数。 即[46, 36 28] 。 我的原始代码会将向量[1 2 3 4]到1234然后使用 hist 进行计数。 当然,当您超过个位数时,这就会崩溃,因为您可以分辨[1, 2, 3, 4]和[12, 34]之间的区别。 回答1 您可以将所有条目转换为字符,然后转换为二维数字数组,最后使用unique(...'rows')获取唯一行的标签并使用它们获取计数。 C = {[46, 36 28], [2 4 5 6], [46, 36 28], [6
  • 转换向量转换为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返回。 对不起,如果我感到困惑或提出非常基本的问题。
  • 将 std::list 转换为 char*[size](Converting a std::list to char*[size])
    问题 出于某种原因,我无法解释,字符数组中的每一项...等于添加到其中的最后一项...例如 progArgs[0] 到 progArgs[size] 包含最后一项的值。 我无法弄清楚我这辈子做错了什么。 有什么建议么? int count = 0; char *progArgs[commandList.size()] for(list<string>::iterator t=commandList.begin(); t!=commandList.end(); t++) { char item[strlen((*t).c_str())]; //create character string strcpy(item, (*t).c_str()); //convert from const char to char progArgs[count] = item; count++; } 编辑: 感谢大家的快速回复......我明白你在说什么 回答1 您将相同的指针(堆栈数组item的第一个元素的地址)分配给progArgs每个元素,然后重复覆盖该内存。 你可以做: progArgs[count] = strdup(t->c_str()); 并去掉 for 正文的前两行。 strdup分配内存,因此您必须稍后使用free释放每个元素。 此外,您没有为 NUL 终止符分配字符。
  • 初始化未知大小的二维数组(Initialize 2-D array of unknown size)
    问题 我有一个二维字符数组,例如char aList[numStrings][maxLength] 。 理想情况下,在程序执行期间,我希望能够修改 aList 的内容,即添加、修改或删除条目。 由于 aList 可能会发生变化,我不想在每次更改后都必须重新编译我的程序来修改 aList。 所以我想在程序结束时将 aList 写到一个文本文件中,然后在下一个程序运行开始时将它读回 aList 。 但是,我不知道程序开始时 numStrings 的值是多少。 (我没有使用 C99,所以我不能使用 VLA,也不能从外部文件中获取先前字符串的计数。)当然,我可以将 numStrings 设置为一个人为的高值,但这令人讨厌! 有没有办法在不知道 numStrings 的值的情况下填充 aList ? 我不认为有(我看过相关的问题)但是有没有另一种方式来实现我所需要的? 回答1 如果您真的希望能够从网格中间删除项目(您的问题对此不清楚),您将需要某种多重链接结构。 这些通常用于实现稀疏数组,因此您可能会找到一个预制的。 我正在谈论这样的事情: +---+ | A | +-|\+ | \ | \ | \ | \ | +----+----+----+ | | C0 | C1 | C2 | ... | +--|-+----+--|-+ | | | | | | +-V--+ +--V-+ | +---
  • 结构中的C ++可变长度数组(C++ variable length arrays in struct)
    问题 我正在编写一个用于创建,发送,接收和解释ARP数据包的程序。 我有一个表示ARP标头的结构,如下所示: struct ArpHeader { unsigned short hardwareType; unsigned short protocolType; unsigned char hardwareAddressLength; unsigned char protocolAddressLength; unsigned short operationCode; unsigned char senderHardwareAddress[6]; unsigned char senderProtocolAddress[4]; unsigned char targetHardwareAddress[6]; unsigned char targetProtocolAddress[4]; }; 这仅适用于长度为6的硬件地址和长度为4的协议地址。地址长度也在标头中给出,因此要正确,结构必须看起来像这样: struct ArpHeader { unsigned short hardwareType; unsigned short protocolType; unsigned char hardwareAddressLength; unsigned char
  • 如何将 R 字符向量转换为 C 字符指针?(How do I convert an R character vector to a C character pointer?)
    问题 我正在尝试将字符向量从 R 传递到 C 并通过 C 字符指针引用它。 但是,我不知道要使用哪种类型转换宏。 下面是一个说明我的问题的小测试。 文件 test.c: #include <Rinternals.h> SEXP test(SEXP chars) { char *s; s = CHAR(chars); return R_NilValue; } 文件 test.R: dyn.load("test.so") chars <- c("A", "B") .Call("test", chars) R的输出: > source("test.R") Error in eval(expr, envir, enclos) : CHAR() can only be applied to a 'CHARSXP', not a 'character' 有什么线索吗? 回答1 字符向量是STRSXP 。 每个单独的元素都是CHARSXP ,因此您需要类似(未经测试)的内容: const char *s; s = CHAR(STRING_ELT(chars, 0)); 请参阅编写 R 扩展的处理字符数据部分。 Dirk 将很快告诉您,如果您只使用 C++ 和 Rcpp,这一切将如何变得更容易。 :) 回答2 可以通过指针CHAR(STRING_ELT(chars, i)
  • 指向未指定大小“(* p)[]”的数组的指针在C ++中是非法的,但在C中是合法的(Pointer to array of unspecified size “(*p)[]” illegal in C++ but legal in C)
    问题 我刚刚发现这在C ++中是非法的(但在C中是合法的): #include <stdio.h> #include <stdlib.h> #define ARRAY_LENGTH(A) (sizeof(A) / sizeof(A[0])) int accumulate(int n, const int (*array)[]) { int i; int sum = 0; for (i = 0; i < n; ++i) { sum += (*array)[i]; } return sum; } int main(void) { int a[] = {3, 4, 2, 4, 6, 1, -40, 23, 35}; printf("%d\n", accumulate(ARRAY_LENGTH(a), &a)); return 0; } 使用gcc -std=c89 -pedantic进行编译,但是使用g++不能进行编译。 当我尝试使用g++进行编译时,出现以下错误消息: main.cpp:5:37: error: parameter 'array' includes pointer to array of unknown bound 'int []' int accumulate(int n, int (*array)[]) ^ main.cpp: In function 'int
  • C++中的字符*与字符串速度(Char* vs String Speed in C++)
    问题 我有一个 C++ 程序,它将从二进制文件中读取数据,最初我将数据存储在std::vector<char*> data 。 我已经更改了我的代码,以便我现在使用字符串而不是 char*,以便std::vector<std::string> data 。 例如,我必须进行的一些更改是从strcmp更改为compare 。 然而,我看到我的执行时间急剧增加。 对于示例文件,当我使用 char* 时需要 0.38 秒,在我的 Linux 机器上转换为字符串后需要 1.72 秒。 我在我的 Windows 机器上观察到类似的问题,执行时间从 0.59 秒增加到 1.05 秒。 我相信这个功能会导致速度变慢。 它是转换器类的一部分,注意在变量名末尾用_指定的私有变量。 我显然在这里遇到了内存问题,并且卡在 C 和 C++ 代码之间。 我希望这是 C++ 代码,所以我更新了底部的代码。 我也在另一个函数中多次访问ids_和names_ ,因此访问速度非常重要。 通过使用创建map而不是两个单独的向量,我已经能够以更稳定的 C++ 代码实现更快的速度。 谢谢大家! 示例 NewList.Txt 2515 ABC 23.5 32 -99 1875.7 1 1676 XYZ 12.5 31 -97 530.82 2 279 FOO 45.5 31 -96 530.8 3 旧代码: void
  • 在 C++ 中将 char 或 string 转换为 bitset(Convert char or string to bitset in c++)
    问题 我正在做一项关于 DES 加密的作业,但我似乎无法将字符串转换为位集,更不用说将字符转换为位集了。 谁能告诉我如何在 C++ 中将单个字符转换为位集? 回答1 以下: char c = 'A'; std::bitset<8> b(c); // implicit cast to unsigned long long 应该管用。 见 http://ideone.com/PtSFvz 的任意长度的转换string到一个bitset是较硬,如果在所有可能的。 位集的大小必须在编译时知道,因此实际上并没有将字符串转换为字符串的方法。 但是,如果您在编译时知道字符串的长度(或者可以在编译时绑定它),您可以执行以下操作: const size_t N = 50; // bound on string length bitset<N * 8> b; for (int i = 0; i < str.length(); ++i) { char c = s[i]; for (int j = 7; j >= 0 && c; --j) { if (c & 0x1) { b.set(8 * i + j); } c >>= 1; } } 这可能有点低效,但我不知道是否有更好的解决方法。
  • 使用C ++可变长度args时,如何从_TCHAR *转换为char *?(How do I convert from _TCHAR * to char * when using C++ variable-length args?)
    问题 我们需要将格式_TCHAR *字符串和许多char *字符串传递给具有可变长度args的函数: inline void FooBar(const _TCHAR *szFmt, const char *cArgs, ...) { //... } 因此可以这样称呼它: char *foo = "foo"; char *bar = "bar"; LogToFileA(_T("Test %s %s"), foo, bar); 显然,一个简单的解决方法是使用_TCHAR代替char,但是不幸的是,我们没有那么奢侈的地方。 我们需要将其与va_start等配合使用,以便我们格式化字符串: va_list args; _TCHAR szBuf[BUFFER_MED_SIZE]; va_start(args, cArgs); _vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args); va_end(args); 不幸的是,我们不能使用它,因为它给了我们这个错误: Unhandled exception at 0x6a0d7f4f (msvcr90d.dll) in foobar.exe: 0xC0000005: Access violation reading location 0x2d86fead. 我在想我们需要将char *转换为_TCHAR
  • 关于 C 中指针和字符串的问题 [重复](Question about pointers and strings in C [duplicate])
    问题 这个问题在这里已经有了答案: 8 年前关闭。 可能的重复: C 中的 char s[] 和 char *s 有什么区别? char *str = “...” 和 char str[N] = “...” 的区别? 我有一些让我感到困惑的代码。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char* string1 = "this is a test"; char string2[] = "this is a test"; printf("%i, %i\n", sizeof(string1), sizeof(string2)); system("PAUSE"); return 0; } 当它输出 string1 的大小时,它会打印 4,这是意料之中的,因为指针的大小是 4 个字节。 但是当它打印string2时,它输出15。我认为一个数组是一个指针,所以string2的大小应该和string1一样对吧? 那么为什么它会为相同类型的数据(指针)打印出两种不同的大小呢? 回答1 数组和指针是完全不同的动物。 在大多数情况下,指定数组的表达式被视为指针。 首先,一点标准语言(n1256): 6.3.2.1 左值、数组和函数指示符 ... 3除了当它是的操作数sizeof操作者或一元
  • 解析二进制文件。 什么是现代方式?(Parsing a binary file. What is a modern way?)
    问题 我有一个二进制文件,其中有一些我知道的布局。 例如让格式是这样的: 2 个字节(无符号短整型)——字符串的长度 5 个字节(5 x 字符) - 字符串 - 一些 id 名称 4 个字节(无符号整数)- 一个大步 24 字节(6 x 浮点数 - 2 个步长,每个 3 个浮点数) - 浮点数据 该文件应如下所示(我为可读性添加了空格): 5 hello 3 0.0 0.1 0.2 -0.3 -0.4 -0.5 这里 5 - 是 2 个字节:0x05 0x00。 “你好” - 5 个字节等等。 现在我想阅读这个文件。 目前我这样做: 将文件加载到ifstream 将此流读取到char buffer[2] 将其转换为 unsigned short: unsigned short len{ *((unsigned short*)buffer) }; . 现在我有一个字符串的长度。 将流读取到vector<char>并从此向量创建std::string 。 现在我有字符串 id。 以同样的方式读取接下来的 4 个字节并将它们转换为 unsigned int。 现在我有一个大步。 而不是文件结束读取浮点数以相同的方式 - 创建一个char bufferFloat[4]并为每个浮点数*((float*)bufferFloat) 。 这有效,但对我来说它看起来很难看。 我可以在不创建char
  • C ++将字符串转换为双精度(C++ Converting a String to Double)
    问题 我整天都在努力寻找解决方案! 您可能将其标记为重新发布,但是我真正想要的是不使用boost lexical cast的解决方案。 一种传统的C ++实现方式会很棒。 我尝试了这段代码,但是它返回了一组乱码和字母。 string line; double lineconverted; istringstream buffer(line); lineconverted; buffer >> lineconverted; 我也尝试过此方法,但始终返回0。 stringstream convert(line); if ( !(convert >> lineconverted) ) { lineconverted = 0; } 提前致谢 :) 编辑:对于我使用的第一个解决方案(乱码)..这是一个快照 回答1 #include <sstream> int main(int argc, char *argv[]) { double f = 0.0; std::stringstream ss; std::string s = "3.1415"; ss << s; ss >> f; cout << f; } 好消息是,此解决方案也适用于其他对象,例如int等。 如果要重复使用相同的缓冲区,则必须在两者之间进行ss.clear 。 还有一个更短的解决方案,您可以将值初始化为字符串流
  • 将字符数组转换为十六进制二进制格式 C++ [重复](Convert a char array to hex binary format C++ [duplicate])
    问题 这个问题在这里已经有了答案: 将十六进制字符串转换为字节数组(20 个回答) 7年前关闭。 我有一个存储 16 个十六进制字符的字符串。 例如: const char* arr = "DD2B23B62AC245DA"; 我需要将这些字符以 8 个字节的格式写入二进制文件。 每个字节由其十六进制值中的两个十六进制字符表示。 我的做法是: unsigned char hexArr[8]; hexArr[0] = 0xDD; hexArr[1] = 0x2B; hexArr[2] = 0x23; ... 这种方式的问题在于它是硬编码的,我需要能够将此数组作为输入,然后填充hexArr数组。 当我复制数组本身时,它将字符 D 的十六进制值而不是 D 设置为十六进制值。 任何帮助我该怎么做? 回答1 我认为最简单的方法是通过代码自己进行转换: std::vector<unsigned char> parseHex(const char *s) { std::vecotr<unsigned char> result; int acc=0, n=0; for (int i=0; s[i]; i++) { acc <<= 4; if (s[i] >= '0' && s[i] <= '9') acc += (s[i] - '0'); else if (s[i] >= 'a' && s[i]
  • 读取直到C ++中的文件结尾(reading until the end of file in C++)
    问题 我正在尝试阅读一个电话簿应用程序的文件的末尾,该应用程序将从C转换为C ++。 当我从文件中打印结果时,我得到以下信息: johnny smith (Home)3 (Cell)4 x☺> x☺> (Home)4 (Cell)4 它应该打印: johnny smith (Home)3 (Cell)4 现在我正在使用while(!infile.eof()) ,这是一个很差的做法,但是当我使用infile.getline()我得到的是名字和姓氏的重复,格式是全部顶起。 有没有办法(或以其他方式)消除输入末尾的垃圾,或以其他方式读取直到C ++中的文件末尾来解决此问题。 我一直在阅读有关不同解决方案的信息,但是很多站点似乎都同意使用fgets ,这是我在原始C版本中所拥有的,但是显然fgets不能与ifstream ,这正是我正在使用的内容。 这是代码: void contacts:: readfile(contacts*friends ,int* counter, int i,char buffer[],char user_entry3[]) { ifstream read; read.open(user_entry3,ios::in); int len; contacts temp; *counter=0; i=0; while (!read.eof()) { temp