【C++文字列操作】string型からchar*型への変換

string型からchar*型へ

string型からchar*型への変換が必要になったのでメモ。

関数定義。

#include <string.h>

inline char* str2char(char* dest, const std::string& src, size_t num) {
    strncpy(dest, src.c_str(), num-1);
    *(dest+num-1) = '\0';
    return dest;
}

#endif

呼び出し元。第三引数にはコピー先の配列長を渡してやります。

#include <iostream>
#include <string>
#include "str_util.h"

int main()
{
    char* c = new char[5]();

    std::string s = "";
    str2char(c, s, 5);
    std::cout << "1. s = \"" << s << "\", c = \"" << c << "\"" << std::endl;

    s = "123";
    str2char(c, s, 5);
    std::cout << "2. s = \"" << s << "\", c = \"" << c << "\"" << std::endl;

    s = "12345";
    str2char(c, s, 5);
    std::cout << "3. s = \"" << s << "\", c = \"" << c << "\"" << std::endl;

    delete[] c;

    return 0;
}  

実行結果。
終端文字'\0'を入れる必要があるので、コピーできる最大サイズは(コピー先配列長 -1)です。

1. s = "", c = ""         
2. s = "123", c = "123"   
3. s = "12345", c = "1234"

string型からconst char*型へ

ちなみにstring型からconst char*型へはc_str()を呼び出すだけでOKですね。

#include <iostream>                                           
#include <string>
#include <typeinfo>                                           

int main()
{
    std::string s = "123";
    std::cout << "s.c_str() = \"" << s.c_str() << "\"" << std::endl;
    std::cout << "typeid(s.c_str()).name() = \""
        << typeid(s.c_str()).name() << "\"" << std::endl;
    return 0;
}                                                           

実行結果。 PKc = const char*型ということらしいです。

s.c_str() = "123"               
typeid(s.c_str()).name() = "PKc"

参考にしたサイト
strncpy
typeid ‐ 通信用語の基礎知識