我在c ++中创建一个与命令行输入一起使用的应用程序。我在命令行输入一个字符串
int main(int argc, char** argv)
{
if(argc != 2)
{
cerr << "Invalid number of CMD arguments" << endl;
return 1;
}
string StringValue = argv[1];
cout << StringValue << endl;
}
这项工作很好。现在我想循环字符串中的字符。 示例:如果我输入“STATES”一词。
^STATES|
|^STATES
S|^STATE
ES|^STAT
TES|^STA
ATES|^ST
TETES|^S
STATES|^
其中“^”是开头和“|”结束。我该怎么做?
答案 0 :(得分:12)
使用std::rotate
http://www.cplusplus.com/reference/algorithm/rotate/
string foo = "abcdefg";
std::rotate(foo.begin(), foo.begin() + 3, foo.end());
cout << foo << endl; //prints defgabc
答案 1 :(得分:0)
如果你想自己实施......
int main()
{
string StringValue = "^STATES|";
string aDoubleStr = StringValue;
aDoubleStr.append(StringValue);
for(int i = StringValue.length() - 1; i >= 0; i--)
{
string aNewStr = aDoubleStr.substr(i , StringValue.length());
cout << aNewStr.c_str() << endl;
}
return 0;
}
答案 2 :(得分:0)
我也更喜欢安德鲁使用std::rotate()
的解决方案。
但是由于OP在评论中要求其他解决方案,我想在这里“哄骗”其他一些想法。这个效率不高:
std::string value = "^STATES|";
size_t pos = 3;
value = value.substr(pos) + value.substr(0, pos);
other idea可以追溯到Doug McIlroy,Brian Kernighan和P.J. Plauger 8,见Jon Bentley:Programming Pearls,第2章。 双手并排握住,拇指指向同一方向。 (将一只手放在另一只手掌上方可能更容易。掌心向您的身体移动。) 转动每只手,然后将双手连接起来:
_|||| _|||| => ||||_ ||||_ => _|||| _||||
\L / \ R/ \L / \ R/ \R / \ L/
在C ++中:
std::string::iterator mid = value.begin() + pos;
std::reverse(value.begin(), mid);
std::reverse(mid, value.end());
std::reverse(value.begin(), value.end());