【问题标题】:in C++ How to assign an element of an array of strings to an array of char?在 C++ 中,如何将字符串数组的元素分配给 char 数组?
【发布时间】:2020-07-12 23:12:55
【问题描述】:

在 c++ 中假设我有:

string s[] = {"red","green","blue"} ;
char c[50] ;

我想做一个这样的任务:

c = s[0] ;

我该怎么做???

【问题讨论】:

  • char c[50] 不是指针类型,顺便说一句 - 将其视为与放置 char c0, c1, c2, c3, c4 相同的东西 - 所以您需要将 string 的字符复制到 c而不仅仅是分配一个指针/引用char c[50]更改为指向堆分配数组的指针或引用。
  • 也就是说,如果你想编写 C++ 而不是 C,那么使用像 std::vectorstd::array 这样的 STL 类型,并避免使用原始指针和原始数组。
  • strncpy(c, s.c_str(), 50); 后跟 c[49] = '\0'; 以确保稳健性
  • 顺便说一句,您通常可以使用 c_str() 函数,例如,如果旧函数需要 const char*。

标签: c++


【解决方案1】:

我会使用std::copy

#include <iostream>
#include <string>

int main()
{
  std::string strings[] = {"string", "string2"};
  char s[10];
  std::copy(strings[0].begin(), strings[0].end(), s);
  std::cout << s; // outputs string
}

使用std::copy 的优势在于它使用了迭代器。

【讨论】:

  • 这不会以空值终止目标 char 数组。
  • 如果输入字符串比缓冲区长,这可能会导致严重的错误。
【解决方案2】:

我会使用std::strncpy。它将归零终止您的缓冲区并且不会越界写入。

char c[50];
std::string test_string = "maybe longer than 50 chars";
std::strncpy(c, test_string.c_str(), sizeof(c));

【讨论】:

    【解决方案3】:

    无论出于何种目的,请考虑是否可以使用 std::string 代替 char 数组(re.array c)。

    如果你还想做,可以使用strcpymemcpy

    const char *cstr = s[0].c_str();
    size_t len = strlen(cstr);
    size_t len_to_copy = len > sizeof c ? sizeof c : len;
    
    memcpy(c, cstr, len_to_copy - 1);
    c[len_to_copy - 1] = 0; 
    

    (如果 'c' 不需要是 C 字符串,则不需要复制一个字节并以空字节结尾)。

    请注意,如果c 没有任何空格,这可能会被截断。也许std::vector&lt;char&gt; 更适合(当然取决于用例)。

    【讨论】:

    • 如果字符串比数组短,它不会被正确地以空值结尾。如果您要用0 覆盖最后一个字符,也可以复制比sizeof c 少一个字符。
    • 或者std::string_view
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2012-05-03
    • 2015-04-25
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多