在字符数组中使用static_cast来使用字符串函数

时间:2016-09-29 08:28:05

标签: c++ string casting

我想使用static_cast在字符数组中使用erase()find()等字符串函数,比如char str[50]。例如,请考虑以下细分:

char str[]="abcdefghi";
char val[]="bc";
static_cast<string>(str).erase(static_cast<string>(str).find(val[0]),1);

请告诉我它是否正确,如果是,则str不会保留它应该具有的值,即"acdefghi"

2 个答案:

答案 0 :(得分:2)

  

请告诉我它是否正确

它无效。

static_cast<string>(str)将从std::string创建一个临时str,其内容将从str复制。对它的任何修改都与原始变量str无关。

您可以在std::string上执行此操作,并在必要时将其转换回const char*

string new_str(str);                    // construct std::string
new_str.erase(new_str.find(val[0]), )); // modification on it
cout << new_str.c_str() << endl;        // convert back to `const char*`

答案 1 :(得分:0)

如果你想像stl容器一样访问char *(raw c string),那么就发明了 std :: experimental :: string_view 。但它只提供对read / iterate / find操作的访问权限,而不是修改。还有一个悲伤的时刻 - 它延迟了C ++ 17标准(无论如何GCC-6.x已经拥有它)。请参阅 boost :: utility :: string_view 。如果你想拥有char *的修改权限,我会建议你使用你自己的包装器在字符串上进行长度检查等。

这是我正在谈论的一个例子:

#include <iostream>
#include <experimental/string_view>
#include "string.h"

using namespace std;


typedef experimental::string_view string_view;

class RawStringWrapper : public string_view
{
    char * sstr;
    size_t len;

public:
    RawStringWrapper(char * str, size_t sz)
        : std::experimental::string_view(str, sz),
          sstr(str),
          len(sz){}

    bool erase(const string &s){
        auto pos = find(s);
        if (std::string::npos != pos){
            sstr[pos] = 0;
            strcat(sstr, sstr + pos + s.size());
            return true;
        }
        return false;
    }
    // ...other modifying functions you need
};

int main(int argc, char *argv[])
{
    char rawString[] = "abcdefgh";
    RawStringWrapper str(rawString, sizeof(rawString));
    str.erase("cde");
    cout << rawString << endl;
    return 0;
}