我需要编写一个程序来扰乱用户输入的4个字母的字符串。 (示例TEST可以像tset,ttse等一样加扰......)我有一个有效的程序,但它仅限于4个元素的char数组,我想知道是否有任何方法可以实现它所以我不知道必须具有预先确定的大小。
//4 letter word scrambler (ex. test tets tset...)
int counter=0;
int main(int argc, char* argv[])
{
char str[4];
cout << "Please enter a word: "; //ask for input
cin >> str;
counter+=1; // set counter to 1
cout << counter << " " << str << endl;
for (int i=0;i<3;i++){// iteration through one full loop in array
swap(str[i], str[i+1]); //swap two elements as iterates through array
counter+=1;//add 1 to counter each time
cout <<counter<<" "<< str << endl;
}
for (int i=0;i<3;i++){
swap(str[i], str[i+1]);
counter+=1;
cout << counter<< " " << str << endl;
}
for (int i=0;i<3;i++){
swap(str[i], str[i+1]);
counter+=1;
cout << counter << " " << str << endl;
}
for (int i=0;i<2;i++){
swap(str[i], str[i+1]);
counter+=1;
cout << counter << " " << str << endl;
}
system("PAUSE");
return 0;
}
答案 0 :(得分:9)
我不确定你是想要将字符串改组一次还是打印字母中所有字母的排列。使用C ++标准库时,两者都相当简单。
这第一段代码执行单个随机随机播放:
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cout << "Please enter a word: "; //ask for input
cin >> str;
random_shuffle(str.begin(), str.end());
cout << str << '\n';
}
以下打印字符串的所有排列:
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cout << "Please enter a word: "; //ask for input
cin >> str;
sort(str.begin(), str.end());
do {
cout << str << '\n';
} while (next_permutation(str.begin(), str.end()));
}
答案 1 :(得分:0)
有一种更容易的方法来扰乱一串长度为N的字段
迭代字符0 -> n-1
中的字符串。
在每次迭代中选择两个随机索引i,j
(通过random(n)
),并交换这两个索引。
你可以证明这将是一个随机均匀的加扰。
答案 2 :(得分:0)
您可以使用std :: string而不是char [4]。 (无论如何,字符串总是优于char [])。那么你的代码就是:
string str; cout << "Please enter a word: "; //ask for input cin >> str; counter+=1; // set counter to 1 cout << counter << " " << str << endl; for (int i=0;i<str.size();i++){ // iteration through one full loop in array
为了更好地改变字符串,请查看:
std::next_permutation