我试图实现一个从当前索引所在的字符串中删除字符的函数。下面是我到目前为止的骨架。我试图将要删除的字符旋转到字符串的末尾,然后用空终止符替换它。我下面的代码似乎没有实际旋转缓冲区,因为我得到的输出是" wor"而不是预期的输出" wrd"。
int main() {
char buffer[]="word";
int currIndex=2;
int endIndex=strlen(buffer);
currIndex--;
endIndex--;
rotate(buffer+currIndex,
buffer+1,
buffer+strlen(buffer));
buffer[endIndex]='\0';
cout << buffer << endl;
return 0;
}
答案 0 :(得分:4)
这不会尝试回答被问到的问题,而是解决根本问题:从字符串中删除单个字符。
解决方案是std::string::erase类成员的简单应用程序:
#include <string>
#include <iostream>
int main() {
std::string word{ "word" };
std::string::size_type currIndex{ 2 };
word.erase( currIndex, 1 );
std::cout << word << std::endl;
}
答案 1 :(得分:1)
使用std :: string会让事情变得更容易,因为我不必考虑指针:
std::string buffer="word";
rotate(buffer.begin()+1, buffer.begin()+2, buffer.end());
buffer.resize(buffer.size()-1);
或者,我们可以坚持使用c风格的数组:
char buffer[]="word";
rotate(buffer+1, buffer+2, buffer+4);
buffer[3] = '\0';
std::rotate
接受3个参数:
template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );
first
是您想要左旋转的范围中的第一个元素。
nfirst
是您在旋转后想要在范围的开头处的元素(这告诉算法有效地旋转多少次,有效)
last
是您想要旋转的范围中的最后一个元素。
您的代码:
char buffer[]="word";
int currIndex=2;
int endIndex=strlen(buffer);
currIndex--;
endIndex--;
rotate(buffer+currIndex,
buffer+1,
buffer+strlen(buffer));
buffer[endIndex]='\0';
实际上非常接近。你刚才得到了第二个论点。应该是
rotate(buffer+currIndex,
buffer+2,
buffer+strlen(buffer));
buffer[endIndex]='\0';
但无可否认,代码在增量和减量方面都有点令人困惑。