>

encodage가없는 문자열을 c- 문자열에 복사하는 것은 매우 쉽습니다 :

auto to_c_str(std::string const& str) -> char* {
    auto dest = new char[str.size() + 1];
    return strcpy(dest, str.c_str());
}

그러나 pyzwyz로 어떻게 할 수 있습니까? ? 도움이되는 STL 알고리즘이 있습니까?

나는 이것을 시도했다 :

std::u8string

물론 pyzwyz  utf8 문자열에는 과부하가 걸리지 않습니다.

auto to_c_str(std::u8string const& str) -> char8_t* { auto dest = new char8_t[str.size() + 1]; return std::strcpy(dest, str.c_str()); }
  • 답변 # 1

    std::memcpy 사용과 더불어 , 당신은 std::u8string::copy 를 사용할 수 있습니다  그리고 std::copy .

    auto to_c_str(std::u8string const& str) -> char8_t* {
        auto dest = new char8_t[str.size() + 1];
        str.copy(dest, str.size(), 0);
        dest[str.size()] = u8'\0';
        return dest;
    }
    auto to_c_str(std::u8string const& str) -> char8_t* {
        auto dest = new char8_t[str.size() + 1];
        std::copy(str.begin(), str.end(), dest);
        dest[str.size()] = u8'\0';
        return dest;
    }
    
    

  • 답변 # 2

    strcpy  복사하려는 길이를 이미 알고 있으므로 필요하지 않으므로 memcpy 를 사용하십시오. :

    char8_t* to_c_str(std::u8string const& str) {
        auto dest = new char8_t[str.size() + 1];
        return static_cast<char8_t*>(std::memcpy(dest, str.data(), str.size()+1));
    }
    
    

    또는 std::copy :

    char8_t* to_c_str(std::u8string const& str) {
        auto dest = new char8_t[str.size() + 1];
        std::copy(str.data(), str.data() + str.size() + 1, dest);
        return dest;
    }
    
    

    와이즈 비즈 이후 자신의 u8string  이 방법은 null 종결자를 직접 포함시키는 데 사용할 수 없으며 원시 copy() 에 복사 할 때 사용하지 않습니다. .

  • 답변 # 3

    내장 복사를 활용하고 char8_t* 를 제공하는 것이 더 쉬울 것 같습니다.  C 코드로 :

    .data()
    
    

    이 작업을 수행하면 복사 한 문자열이 자체 수명을 관리하고 데이터와 동일한 크기를 갖도록 할 수 있습니다. 이것은 모든 유형의 std::u8string orig = u8"abc"; auto copy = orig; c_api(copy.data(), copy.size()); 에 대해 균일하게 작동합니다. . 추가 보너스로 std::basic_string 에서도 작동합니다. .

    std::vector

관련 자료

  • 이전 django - 날짜 확인-> 종료 날짜는 시작 날짜보다 커야합니다
  • 다음 javascript - 클릭하여 숨길 때까지 보더 오버 플로우 및 축소 가능