2016-11-27 112 views
1

我打算写一个函数来保持字符串的第一个和最后一个字母相同,并在最后一个字母后面忽略任何非字母。我应该使用std :: random_shuffle()。我阅读文档,但我似乎并没有把握这个功能的概念。这是我的代码:在一个字符串中随机播放字母C++

#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; 
} 

编辑:现在,但是我不断收到错误:分段错误(核心转储)。有人知道为什么吗?似乎无法找到问题。

+0

它随机打乱您提供 – Alex

+0

你需要学习如何使用调试器的参数之间的内容。同时回答这些问题:last_letter的最终价值是什么?在哪一行分配? –

回答

3

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]); 

两种方法都将被罚款。

+0

谢谢你的回答!是非常丰富和有益的,我们还没有涉及指针,所以这是一个非常奇怪的发布这样的演习。我认为我修复了我的代码(它被编译),但是现在我不断收到错误:分段错误(核心转储),我似乎无法找到问题。我在我的帖子中修复了我的代码。 – mthe25

+0

我最初指出的错误。你的数学是关闭的。你在一堆地方掉了一个。我用'size()'指出了这个问题,但是在其他几个地方也有同样的错误。此外,您没有正确计算结束迭代器值。查看我对结束迭代器值的解释,然后使用调试器一次一行地遍历代码。 –

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

  2. 这是左边的一个位置是最后一个字母的位置。

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

  4. 只需用你的“第一个”和“最后一个”来调用random_shuffle。

下面是一些有用的链接:

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

请记住, “开始” 是包容性的, “结束” 独家”

-1

的东西,让你开始它至少。一个角落案例,你必须修复。访问cppreference。了解算法的工作原理。

#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