随机排列字符串中的字母c ++
shuffle letters in a string c++
我打算编写一个函数,使字符串的第一个和最后一个字母保持相同,并忽略最后一个字母之后的所有非字母。我应该使用 std::random_shuffle()。我阅读了文档,但是我似乎没有掌握此功能的概念。这是我的代码:
#include <iostream>
#include <algorithm>
#include <string>
std::string mix(std::string s){
int last_char;
if(std::isalpha(s[s.size()-1]) == true){
last_char = s.size()-1;
} else {
for(int i=s.size()-1 ; i>0; --i){
if((std::isalpha(s[i]) == false) && (std::isalpha(s[i-1])==true)){
last_char = i -1;
break;
}
}
}
std::random_shuffle(&s[1],&s[last_char]);
return s;
}
int main(){
std::string test = "Hello";
std::cout << mix(test) << std::endl;
}
编辑:但是现在我不断收到错误:分段错误(核心已转储)。任何人都知道为什么吗?似乎找不到问题。
std::random_shuffle
将迭代器或指针作为参数,而不是 array/container 中要排序的值。您对 std::random_shuffle
的调用可能应该是:
std::random_shuffle(&s[1],&s[last_char]);
注意第二个参数是结束迭代器值。结束迭代器不指向要排序的最后一个值,而是指向之后的值。
这不是所示代码的唯一问题。您需要修复代码中调用 std::random_shuffle
之前的几个错误。例如:
for(int i=s.size() ; i>0; --i){
if((std::isalpha(s[i]) == false) && (std::isalpha(s[i-1])==true)){
s.size()
给出字符串的大小。在第一次迭代中,i
将等于它的 size()
,但访问 s[i]
现在将导致未定义的行为和错误,因为 s[i]
显然不存在。在包含 n
个字符的字符串中,字符当然是 s[0]
到 s[n-1]
。
您需要修改算法,使 last_char
最终成为下一个字符 after 的索引一个你想洗牌,然后使用上面的固定 std::random_shuffle
调用。
或者,计算 last_char
作为要排序的最后一个字符的索引,然后调用
std::random_shuffle(&s[1],&s[last_char+1]);
任何一种方法都可以。
您需要在字符串的右侧找到最左边的 "non-letter"。
左边一个地方是最后一个字母的位置。
右边一个地方是你的第一个字母。
只需用您的 "first" 和 "last" 调用 random_shuffle。
这里有一些有用的链接:
http://www.cplusplus.com/reference/algorithm/random_shuffle/
记住 "begin" 是包容性的,"end" 是排他性的
让您入门的东西。它至少有一个你必须修复的极端情况。访问 cppreference.com 了解算法的工作原理。
#include <iostream>
#include <cctype>
#include <algorithm>
#include <string>
std::string
special_shuffle(std::string s)
{
if (s.size() < 3) return s;
auto begin = std::find_if(s.begin(), s.end(), ::isalpha);
auto end = std::find_if(s.rbegin(), s.rend(), ::isalpha).base();
std::random_shuffle(++begin, --end);
return s;
}
int
main()
{
std::string s1 = "Hello World!";
std::string s2 = "AB";
std::string s3 = "A";
std::string s4 = "";
std::string s5 = "a string going from a to z";
std::cout << s1 << " --> " << special_shuffle(s1) << "\n"
<< s2 << " --> " << special_shuffle(s2) << "\n"
<< s3 << " --> " << special_shuffle(s3) << "\n"
<< s4 << " --> " << special_shuffle(s4) << "\n"
<< s5 << " --> " << special_shuffle(s5) << "\n";
}
编译并运行:
$ g++ example.cpp -std=c++14 -Wall -Wextra
$ ./a.out
Hello World! --> Hooll eWlrd!
AB --> AB
A --> A
-->
a string going from a to z --> aarfritomgi nnso t g goz
我打算编写一个函数,使字符串的第一个和最后一个字母保持相同,并忽略最后一个字母之后的所有非字母。我应该使用 std::random_shuffle()。我阅读了文档,但是我似乎没有掌握此功能的概念。这是我的代码:
#include <iostream>
#include <algorithm>
#include <string>
std::string mix(std::string s){
int last_char;
if(std::isalpha(s[s.size()-1]) == true){
last_char = s.size()-1;
} else {
for(int i=s.size()-1 ; i>0; --i){
if((std::isalpha(s[i]) == false) && (std::isalpha(s[i-1])==true)){
last_char = i -1;
break;
}
}
}
std::random_shuffle(&s[1],&s[last_char]);
return s;
}
int main(){
std::string test = "Hello";
std::cout << mix(test) << std::endl;
}
编辑:但是现在我不断收到错误:分段错误(核心已转储)。任何人都知道为什么吗?似乎找不到问题。
std::random_shuffle
将迭代器或指针作为参数,而不是 array/container 中要排序的值。您对 std::random_shuffle
的调用可能应该是:
std::random_shuffle(&s[1],&s[last_char]);
注意第二个参数是结束迭代器值。结束迭代器不指向要排序的最后一个值,而是指向之后的值。
这不是所示代码的唯一问题。您需要修复代码中调用 std::random_shuffle
之前的几个错误。例如:
for(int i=s.size() ; i>0; --i){
if((std::isalpha(s[i]) == false) && (std::isalpha(s[i-1])==true)){
s.size()
给出字符串的大小。在第一次迭代中,i
将等于它的 size()
,但访问 s[i]
现在将导致未定义的行为和错误,因为 s[i]
显然不存在。在包含 n
个字符的字符串中,字符当然是 s[0]
到 s[n-1]
。
您需要修改算法,使 last_char
最终成为下一个字符 after 的索引一个你想洗牌,然后使用上面的固定 std::random_shuffle
调用。
或者,计算 last_char
作为要排序的最后一个字符的索引,然后调用
std::random_shuffle(&s[1],&s[last_char+1]);
任何一种方法都可以。
您需要在字符串的右侧找到最左边的 "non-letter"。
左边一个地方是最后一个字母的位置。
右边一个地方是你的第一个字母。
只需用您的 "first" 和 "last" 调用 random_shuffle。
这里有一些有用的链接:
http://www.cplusplus.com/reference/algorithm/random_shuffle/
记住 "begin" 是包容性的,"end" 是排他性的
让您入门的东西。它至少有一个你必须修复的极端情况。访问 cppreference.com 了解算法的工作原理。
#include <iostream>
#include <cctype>
#include <algorithm>
#include <string>
std::string
special_shuffle(std::string s)
{
if (s.size() < 3) return s;
auto begin = std::find_if(s.begin(), s.end(), ::isalpha);
auto end = std::find_if(s.rbegin(), s.rend(), ::isalpha).base();
std::random_shuffle(++begin, --end);
return s;
}
int
main()
{
std::string s1 = "Hello World!";
std::string s2 = "AB";
std::string s3 = "A";
std::string s4 = "";
std::string s5 = "a string going from a to z";
std::cout << s1 << " --> " << special_shuffle(s1) << "\n"
<< s2 << " --> " << special_shuffle(s2) << "\n"
<< s3 << " --> " << special_shuffle(s3) << "\n"
<< s4 << " --> " << special_shuffle(s4) << "\n"
<< s5 << " --> " << special_shuffle(s5) << "\n";
}
编译并运行:
$ g++ example.cpp -std=c++14 -Wall -Wextra
$ ./a.out
Hello World! --> Hooll eWlrd!
AB --> AB
A --> A
-->
a string going from a to z --> aarfritomgi nnso t g goz