C++ C++;-程序已停止工作

C++ C++;-程序已停止工作,c++,console-application,C++,Console Application,我在下面发布的代码应该在递归(Sort()函数)中工作,甚至可以工作1kk次。问题是:当Sort()函数进入编号为43385的循环时,控制台停止工作并发出警报:“程序已停止工作”。这是内存问题吗?如果是,代码的错误部分在哪里?你好 #包括 #包括 使用名称空间std; a、b串; int n=0,i=0,计数器=0; 整数排序(整数i) { int x=0,y=0,tmp0=0; 字符tmp1; 对于(x=i;x=i;y--) y==i?a[i]=tmp1:a[y]=a[y-1]; 计数器+

我在下面发布的代码应该在递归(Sort()函数)中工作,甚至可以工作1kk次。问题是:当Sort()函数进入编号为43385的循环时,控制台停止工作并发出警报:“程序已停止工作”。这是内存问题吗?如果是,代码的错误部分在哪里?你好

#包括
#包括
使用名称空间std;
a、b串;
int n=0,i=0,计数器=0;
整数排序(整数i)
{  
int x=0,y=0,tmp0=0;
字符tmp1;
对于(x=i;x=i;y--)
y==i?a[i]=tmp1:a[y]=a[y-1];
计数器+=tmp0-i;
如果(i==n-1)
返回计数器;
其他的
排序(i+1);
}  
int main()
{  
cin>>n>>a>>b;
排序(0);
返回0;
}

可能是因为递归太深而导致调用堆栈溢出?

可能是因为递归太深而导致调用堆栈溢出?

计数器的类型为int,但其中有许多值的总和可能大于int。可能尝试int64?

计数器的类型为int,但其中有许多值的总和可能大于int都比int大。可以试试int64?

您可以硬编码一些测试用例,如n=20、a=“xyz…”、b=“abc…”,并将打印语句添加到排序函数中以跟踪发生的情况。此外,添加一些注释以澄清不同循环的用途可能会有所帮助。

您可以硬编码一些测试用例,如n=20、a=“xyz…”、b=“abc…”,并将打印语句添加到排序函数中以跟踪发生的情况。此外,添加一些注释可能有助于澄清不同循环的用途。

若要添加到iltal的注释中,您可能需要打印关于字符串a、b:a.size()、a.length()、a.capacity()、a.max_size()的信息。

若要添加到iltal的注释中,您可能需要打印关于字符串a、b:a.size()、a.length()的信息,a.capacity(),a.max_size()

我不确定这段代码要做什么。这是一个修订版,添加了一些打印语句,以及一个随机字符串生成器

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;  
string a, b;  
int n=0,i=0,counter=0;

int Sort(int i)  
{  
int x=0,y=0,tmp0=0;  
char tmp1;  

for(x=i;x<n;x++) {
    if(a[x]==b[i]){
        tmp0=x;
        tmp1=a[x];
    cout << "x = " << x << " set tmp0 to " << tmp0 << " and tmp1 to " << tmp1 << endl;
        break;
    }
    else
        continue;
}
for(y=tmp0;y>=i;y--)
    y==i ? a[i]=tmp1 : a[y]=a[y-1];

counter+=tmp0-i;
cout << "  endof sort: a is " << a << endl;
cout << "              b is " << b << endl;
if(i==n-1) {
    cout << "Returning counter " << counter << endl;
    return counter;
} else {
    cout << "Running sort(" << i << " + 1)" << endl;
    Sort(i+1); 
}
}  
string randomStrGen(int length) {
static string charset =       "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
string result;
result.resize(length);

for (int i = 0; i < length; i++)
    result[i] = charset[rand() % charset.length()];

return result;
}
int main()  
{  
n = 50;
srand(time(NULL));
string a0, b0;
a0 = randomStrGen(n);
a = a0;
b0 = randomStrGen(n);
b = b0;
// cin >> n >> a >> b;  
cout << "Max string size is " << a.max_size() << endl;
cout << "Calling sort" << endl
     << " n is " << n << endl
 << " a is " << a << endl
 << " b is " << b << endl;
Sort(0);  
cout << "  endof program: a inital: " << a0 << endl;
cout << "                 a final:  " << a << endl;
cout << "                 b inital: " << b0 << endl;
cout << "                 b final:  " << b << endl;
return 0;  
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
a、b串;
int n=0,i=0,计数器=0;
整数排序(整数i)
{  
int x=0,y=0,tmp0=0;
字符tmp1;

对于(x=i;x我不确定这段代码试图做什么。这里有一个修订,添加了一些打印语句,以及一个随机字符串生成器

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;  
string a, b;  
int n=0,i=0,counter=0;

int Sort(int i)  
{  
int x=0,y=0,tmp0=0;  
char tmp1;  

for(x=i;x<n;x++) {
    if(a[x]==b[i]){
        tmp0=x;
        tmp1=a[x];
    cout << "x = " << x << " set tmp0 to " << tmp0 << " and tmp1 to " << tmp1 << endl;
        break;
    }
    else
        continue;
}
for(y=tmp0;y>=i;y--)
    y==i ? a[i]=tmp1 : a[y]=a[y-1];

counter+=tmp0-i;
cout << "  endof sort: a is " << a << endl;
cout << "              b is " << b << endl;
if(i==n-1) {
    cout << "Returning counter " << counter << endl;
    return counter;
} else {
    cout << "Running sort(" << i << " + 1)" << endl;
    Sort(i+1); 
}
}  
string randomStrGen(int length) {
static string charset =       "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
string result;
result.resize(length);

for (int i = 0; i < length; i++)
    result[i] = charset[rand() % charset.length()];

return result;
}
int main()  
{  
n = 50;
srand(time(NULL));
string a0, b0;
a0 = randomStrGen(n);
a = a0;
b0 = randomStrGen(n);
b = b0;
// cin >> n >> a >> b;  
cout << "Max string size is " << a.max_size() << endl;
cout << "Calling sort" << endl
     << " n is " << n << endl
 << " a is " << a << endl
 << " b is " << b << endl;
Sort(0);  
cout << "  endof program: a inital: " << a0 << endl;
cout << "                 a final:  " << a << endl;
cout << "                 b inital: " << b0 << endl;
cout << "                 b final:  " << b << endl;
return 0;  
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
a、b串;
int n=0,i=0,计数器=0;
整数排序(整数i)
{  
int x=0,y=0,tmp0=0;
字符tmp1;

对于(x=i;x),您应该尝试使用调试器(如Linux下的
gdb
)来找出发生了什么。您最好使用
g++-g-Wall
进行编译,假设您有一个类似GCC的编译器,您应该尝试使用调试器(如Linux下的
gdb
)要了解发生了什么。您最好使用
g++-g-Wall
进行编译,假设您在排序(i+1)之前有一个类似GCC的编译器[实际上是在排序之前或之后,我无法检查它)备注:不需要在第一个for循环中使用else continue,循环仍将继续下一次迭代。tmp0、tmp1不是有用的名称。例如,更好的名称是tmp0的索引和tmp1的值或类似名称。使用这些名称很难理解这些参数的含义。排序(i+1)之前[实际上就在之前或之后,我无法检查它)备注:不需要在第一个for循环中使用else continue,循环仍将继续下一次迭代。tmp0、tmp1不是有用的名称。例如,更好的名称是tmp0的索引和tmp1的值或类似的名称。使用这些名称很难理解这些参数的含义。我在cr之前使用了计数器值ash非常适合long int,如果需要,甚至可以是无符号long int,但它仍然不起作用。我做过,崩溃前的计数器值非常适合long int,如果需要,甚至可以是无符号long int,但它仍然不起作用。