如何在C++中列出所有长度为12的字符串

How to list all strings of length 12 in C++?

本文关键字:字符串 C++      更新时间:2023-10-16

我是一个自学成才的新手程序员。我试着制作一个程序,列出所有长度为12的字符串,比如它的字符来自a-z。然而,我似乎能找到一个bug。它输出例如The word is ).。有人能告诉我我做错了什么吗?有没有更简单的方法来做这个程序?

#include <iostream>
#include <string>
int main(int argc, char *argv[])
{
using namespace std;
string l ("qwertyuiopasdfghjklzxcvbnm");
string test ("");
for(int i1 = 0;i1 < 26;++i1)
for(int i2 = 0;i2 < 26;++i2)
for(int i3 = 0;i3 < 26;++i3)
for(int i4 = 0;i4 < 26;++i4)
for(int i5 = 0;i5 < 26;++i5)
for(int i6 = 0;i6 < 26;++i6)
for(int i7 = 0;i7 < 26;++i7)
for(int i8 = 0;i8 < 26;++i8)
for(int i9 = 0;i9 < 26;++i9)
for(int i10 = 0;i10 < 26;++i10)
for(int i11 = 0;i11 < 26;++i11)
for(int i12 = 0;i12 < 26;++i12)  {
test = l[i1]+l[i2]+l[i3]+l[i4]+l[i5]+l[i6]+l[i7]+l[i8]+l[i9]+l[i10]+l[i11]+l[i12];
cout << "The word is " << test << "." << endl;
test = "";
}
return 0;
}

l[i1]+l[i2]不会做您期望的事情。您正在添加两个类型为char的表达式,因此您将获得类型为int的结果。

一个简单的解决方案是:

test = std::string() + l[i1]+l[i2]+l[i3]+l[i4]+l[i5]+l[i6]+l[i7]+l[i8]+l[i9]+l[i10]+l[i11]+l[i12];

正如我在评论中提到的,当你看到这样的排列问题时,你应该考虑如何编写递归算法。

在这种情况下,问问自己每一步(级别)是什么样子的。好吧,你已经得到了到达这一点的字符串,你需要遍历字母,每次都需要调用下一个级别,这样它才能继续这个过程。

将其转化为代码,"给定到此为止的字符串"意味着递归函数在前缀字符串中传递,并且一个数字指示它在链中的位置:

void print_all_strings(const std::string& prefix, unsigned remain) {

在字母之间循环是你已经掌握的(使用for循环),但你这样做的方式并不好。与其将所有字符键入字符串中并迭代这些字符,不如意识到可以像迭代数字一样迭代for循环中的字符,因为字符是C++(和C)中的数字。换句话说,'a' + 1 == 'b'等等。所以你的循环变成:

for(char c = 'a'; c <= 'z'; c++)

最后,您需要处理下一个级别。这意味着使用prefixremain参数来确定下一步要做什么。好吧,我们知道一件事:如果还剩0个字母,那么不要添加一个字母,而是打印字符串并返回!

if(remain == 0) {
cout << "The word is " << prefix << "." << endl;
return;
}

在其他情况下,我们需要添加一个字母。这就是std::string + char => std::string的作用。(注意char + char => char!)

print_all_strings(prefix + c, remain - 1);

综合起来:

void print_all_strings(const std::string& prefix, unsigned remain) {
if(remain == 0) {
cout << "The word is " << prefix << "." << endl;
return;
}
for(char c = 'a'; c <= 'z'; c++)
print_all_strings(prefix + c, remain - 1);
}
int main(int argc, char *argv[])
{
print_all_strings("", 12);
return 0;
}

但是,正如CiaPan所解释的那样,在这个程序完成之前,你的电脑就会死机。