在最后一次出现字符 C++ 时删除 char 数组的开头
Removing start of char array at last occurrence of a character C++
我正在寻找删除字符串开头直到字符最后一次出现的最佳方法。例如。我有一个包含以下内容的字符数组:
[Microsoft][ODBC SQL Server Driver][SQL Server]Option 'enable_debug_reports' requires a value of 0 or 1.
基本上,我正在查找最后一次出现的“]”。我希望我的 char 数组被修剪为:
Option 'enable_debug_reports' requires a value of 0 or 1.
我找到了几种方法来处理字符串数据类型。我想知道是否有一种有效的方法来操作 char 数组。我的程序要求几个参数是 char[] 而不是字符串。在我的情况下,我将如何使用 strcpy
之类的东西?
如果您的字符串确实包含“]”字符,则以下应该有效:
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 != '[=11=]') {
*toPtr = *fromPtr;
++fromPtr;
++toPtr;
}
*toPtr = '[=11=]';
你可以使用 strrchr to find the last occurrence of ']' and then cut your char[] using memcpy as seen here
如果您出于某种原因坚持不使用 std::string
,仍然有一种使用标准 算法 的纯 C++ 方法,它可以很好地处理原始数组。以下是 C++14(它使用 std::rbegin
和 std::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;
}
请注意,此解决方案假定您需要将子字符串作为 copy,并且不会对不包含指定值的输入进行错误检查。
当然,对于任何 C API,您最好切换到 std::string
并使用 c_str()
。
我正在寻找删除字符串开头直到字符最后一次出现的最佳方法。例如。我有一个包含以下内容的字符数组:
[Microsoft][ODBC SQL Server Driver][SQL Server]Option 'enable_debug_reports' requires a value of 0 or 1.
基本上,我正在查找最后一次出现的“]”。我希望我的 char 数组被修剪为:
Option 'enable_debug_reports' requires a value of 0 or 1.
我找到了几种方法来处理字符串数据类型。我想知道是否有一种有效的方法来操作 char 数组。我的程序要求几个参数是 char[] 而不是字符串。在我的情况下,我将如何使用 strcpy
之类的东西?
如果您的字符串确实包含“]”字符,则以下应该有效:
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 != '[=11=]') {
*toPtr = *fromPtr;
++fromPtr;
++toPtr;
}
*toPtr = '[=11=]';
你可以使用 strrchr to find the last occurrence of ']' and then cut your char[] using memcpy as seen here
如果您出于某种原因坚持不使用 std::string
,仍然有一种使用标准 算法 的纯 C++ 方法,它可以很好地处理原始数组。以下是 C++14(它使用 std::rbegin
和 std::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;
}
请注意,此解决方案假定您需要将子字符串作为 copy,并且不会对不包含指定值的输入进行错误检查。
当然,对于任何 C API,您最好切换到 std::string
并使用 c_str()
。