【问题标题】:Removing start of char array at last occurrence of a character C++在最后一次出现字符 C++ 时删除 char 数组的开始
【发布时间】:2015-05-07 01:03:24
【问题描述】:

我正在寻找删除字符串开头直到最后一个字符出现的最佳方法。例如。我有一个包含以下内容的 char 数组:

[Microsoft][ODBC SQL Server Driver][SQL Server]Option 'enable_debug_reports' 要求值为 0 或 1。

基本上,我正在寻找最后一次出现的 ']'。我希望将我的 char 数组修剪为:

选项 'enable_debug_reports' 要求值为 0 或 1。

我已经找到了几种使用字符串数据类型的方法。我想知道是否有一种有效的方法来操作 char 数组。我的程序需要几个参数是 char[] 而不是字符串。在我的情况下,我将如何使用 strcpy 之类的东西?

【问题讨论】:

  • 如果你想使用std::strings,但又需要使用const char *的一些函数,你可以使用myString.c_str()
  • 我希望我的问题专门针对 char[]。谢谢您的建议。但是,我想知道是否可以在不使用 std::string 或任何强制转换的情况下完成相同的操作。

标签: c++ arrays char trim


【解决方案1】:

如果您的字符串确实包含“]”字符,则以下内容应该可以工作:

std::string trimIt(originalCStr);
std::string trimmed(trimIt.substr(trimIt.find_last_of("]")));
strcpy(originalCStr, trimmed.c_str());

对于纯 C 方法:

char *toPtr = originalCStr;
char *fromPtr = strchr(toPtr, ']');
++fromPtr;
while (*fromPtr != '\0') {
    *toPtr = *fromPtr;
    ++fromPtr;
    ++toPtr;
}
*toPtr = '\0';

【讨论】:

    【解决方案2】:

    您可以使用 strrchr 找到最后一次出现的 ']',然后使用 memcpy 剪切您的 char[],如 here 所示

    【讨论】:

    • memmove 如果副本在同一个缓冲区中。并且可能(或实际上)重叠。或者只是一个普通的 dstsrc 指针循环通过终止符。
    【解决方案3】:

    如果您坚持不使用std::string,无论出于何种原因,仍然有一种使用标准算法 的纯C++ 方法,它可以很好地处理原始数组。以下是C++14(它使用std::rbeginstd::rend),但如果需要,您可以手动使用std::reverse_iterator将其适配到C++11:

    #include <algorithm>
    #include <iostream>
    
    template <class InputRange, class OutputIterator, class Value>
    void CopyFrom(InputRange const& input, OutputIterator output_iter, Value const& value)
    {
        using std::rbegin;
        using std::rend;
        using std::end;
    
        auto const iter_last = std::find(rbegin(input), rend(input), value);
        std::copy(iter_last.base(), end(input), output_iter);
    }
    
    int main()
    {
        char const src[] = "[Microsoft][ODBC SQL Server Driver][SQL Server]Option 'enable_debug_reports' requires a value of 0 or 1.";
        char * dst = new char[sizeof(src) + 1](); // just for this toy program
    
        CopyFrom(src, dst, ']');
    
        std::cout << dst;
        delete[] dst;
    }
    

    请注意,此解决方案假定您需要将子字符串作为副本,并且对不包含指定值的输入不进行错误检查。

    当然,您最好切换到std::string 并将c_str() 用于任何C API。

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多