弦C 中的洗牌字母

shuffle letters in a string c++

本文关键字:      更新时间:2023-10-16

我打算写一个函数,该函数将字符串的第一个和最后一个字母保持相同,而忽略了最后一个字母之后的任何非字母。我应该使用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将迭代器或指针作为参数,而不是要排序的数组/容器中的值。您对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最终成为下一个字符之后的索引,您想随时散装的索引,然后使用固定的std::random_shuffle在上方致电。

或或者,计算last_char是最后一个字符的索引,并调用

std::random_shuffle(&s[1],&s[last_char+1]);

两种方法都可以。

  1. 您需要在字符串的右侧找到最左边的"非字母"。

  2. 左侧的一个地方是最后一个字母的位置。

  3. 右边的一个地方是您的第一个字母。

  4. 只需用"第一个"answers"最后"调用Random_shuffle。

这是一些有用的链接:

http://www.cplusplus.com/reference/algorithm/random_shuffle/

请记住,"开始"是包容性的," 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
相关文章:
  • 没有找到相关文章