在最后一次出现的字符C ++中删除char数组的开始

时间:2015-03-05 15:30:41

标签: c++ arrays char trim

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

  

[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]选项'enable_debug_reports'需要值0或1.

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

  

选项'enable_debug_reports'需要值0或1.

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

3 个答案:

答案 0 :(得分:2)

如果您的字符串包含']'字符,则以下内容应该有效:

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';

答案 1 :(得分:2)

您可以使用strrchr查找最后一次出现的']'然后使用memcpy切换你的char [],如here

答案 2 :(得分:1)

如果你坚持不使用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。