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

C++ 如何在C+中列出长度为12的所有字符串+;?,c++,C++,我是一个学习自己编程的新手。我试着制作一个程序,列出所有长度为12的字符串,比如它的字符来自a-z。然而,我似乎发现了一个bug。例如,它输出单词is)。有人能告诉我我做错了什么吗?有没有更简单的方法来完成这个程序 #include <iostream> #include <string> int main(int argc, char *argv[]) { using namespace std; string l ("qwertyuiopasdfgh

我是一个学习自己编程的新手。我试着制作一个程序,列出所有长度为12的字符串,比如它的字符来自a-z。然而,我似乎发现了一个bug。例如,它输出
单词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;
}
#包括
#包括
int main(int argc,char*argv[])
{
使用名称空间std;
字符串l(“qwertyuiopasdfghjklzxcvbnm”);
字符串测试(“”);
对于(int i1=0;i1<26;++i1)
对于(int i2=0;i2<26;++i2)
对于(inti3=0;i3<26;++i3)
对于(inti4=0;i4<26;++i4)
对于(int i5=0;i5<26;++i5)
对于(int i6=0;i6<26;++i6)
对于(int i7=0;i7<26;++i7)
对于(int i8=0;i8<26;++i8)
对于(int i9=0;i9<26;++i9)
对于(int i10=0;i10<26;++i10)
对于(int i11=0;i11<26;++i11)
对于(int i12=0;i12<26;++i12){
测试=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
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];

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
循环)而不是把所有的字符输入到一个字符串中,并反复迭代这些字符,你最好意识到你可以在<代码>中迭代字符,以< /COD> >循环,就像你可以重复数字一样,因为字符是C++中的数字(和C)。。换句话说,
'a'+1=='b'
等等。因此,您的循环变成:

for(char c = 'a'; c <= 'z'; c++)
在其他情况下,我们需要添加一个字母。
std::string+char=>std::string
(注意
char+char=>char

总而言之:

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;
}
void打印所有字符串(常量std::字符串和前缀,未签名保留){
如果(保持==0){

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

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

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

void print_all_strings(const std::string& prefix, unsigned remain) {
遍历字母是您已经得到的(使用
for
循环)而不是把所有的字符输入到一个字符串中,并反复迭代这些字符,你最好意识到你可以在<代码>中迭代字符,以< /COD> >循环,就像你可以重复数字一样,因为字符是C++中的数字(和C)。。换句话说,
'a'+1=='b'
等等。因此,您的循环变成:

for(char c = 'a'; c <= 'z'; c++)
在其他情况下,我们需要添加一个字母。
std::string+char=>std::string
(注意
char+char=>char

总而言之:

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;
}
void打印所有字符串(常量std::字符串和前缀,未签名保留){
如果(保持==0){

这可能会让人很困惑。任何时候你发现自己像那样重复,都要考虑做一个函数。在这种情况下,是一个递归函数。至于你做错了什么,像
l[i1]
这样的表达式会返回一个字符(由于传统的C支持)也被视为整数,而不是长度为1的字符串。因此,当您“添加”他们,你在添加字符代码并得到一个新的代码。@JonathanWood:我个人完全不同意。我可以在大约10秒钟内阅读和理解这段代码。当然很难扩展或使其通用,但这并不意味着代码令人困惑。@BillLynch:你认为我试图制作一个列出所有字符的程序的句子吗l长度为12的字符串(例如其字符来自a-z)构造得很好?你认为适当的缩进不会使代码更容易阅读吗?你真的认为这里的概念表达得很好吗?所有字符串?你估计过要打印多少字符串吗?假设你每秒打印一百万个字符串,你将需要大约3000个s年来完成这项任务。这可能会让人很困惑。每当你发现自己像那样重复时,请考虑创建一个函数。在这种情况下,是一个递归函数。至于你做错了什么,像
l[i1]
这样的表达式会返回一个字符(由于传统的C支持)也被视为整数,而不是长度为1的字符串。因此,当您“添加”他们,你在添加字符代码并得到一个新的代码。@JonathanWood:我个人完全不同意。我可以在大约10秒钟内阅读和理解这段代码。当然很难扩展或使其通用,但这并不意味着代码令人困惑。@BillLynch:你认为我试图制作一个列出所有字符的程序的句子吗l长度为12的字符串,如其字符