我是C ++的新手,我似乎无法解决这个问题。这个代码只是让用户输入一个动物列表(不超过25只动物,30个字母长),然后它将按照输入的顺序输出它们,然后按字母顺序输出(使用冒泡排序)。如果我的代码难以理解或理解,我会道歉。
每当我放入诸如“dog”,“cat”,“fish”等动物并以句点终止列表时,我通常会在CharacterStrings.exe中的0x55b6d2f3处获得“未处理的异常:0xC0000005:访问冲突读取位置0xcccccccc”。 “但其他时候我得到“在CharacterStringsList.exe中发生了缓冲区溢出,这已经破坏了程序的内部状态。”
我对如何解决这个问题感到非常困惑。我尝试了谷歌这两个,但我似乎找不到任何适合我的解决方案(因为我还是初学者,不知道如何做更多高级代码)。我很确定错误是在我的交换功能中的某个地方(也许?)但是我无法想象它。也许是逻辑错误?我已经尝试了我能想到的一切。
如果您有任何疑问,请与我联系。任何帮助或建议将不胜感激!提前谢谢你:)
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
void getInput(char animals[][30]);
void outputLists(char animals[][30]);
void bubbleSort(char animals[][30], int n);
void Swap(char *a, char *b);
void getInput(char animals[][30])
{
cout << "Please enter a list of animals, terminated by a period: " << endl;
for(int i = 0; i < 25; i++)
{
cin >> animals[i];
if(strcmp(animals[i], ".") == 0)
break;
}
}
void bubbleSort(char animals[][30], int size)
{
for(int i = 0; i < size-1; i++)
for(int j = 0; j < size-1; j++)
if(animals[j] < animals[j+1])
Swap(animals[j], animals[j+1]);
}
void Swap(char *a, char *b)
{
char t[30];
strcpy(t, a);
strcpy(a, b);
strcpy(b, t);
}
void outputLists(char animals[][30])
{
//Output original list
for(int i = 0; i < 25; i++)
{
if(strcmp(animals[i], ".") == 0)
break;
cout << animals[i] << endl;
}
//Output sorted list
for(int i = 0; i < 25; i++)
cout << animals[i] << endl;
}
int main()
{
char animals[25][30];
getInput(animals);
cout << endl;
bubbleSort(animals,25);
outputLists(animals);
cout << endl;
system("pause");
return 0;
}
答案 0 :(得分:1)
使用strcmp(s1, s2)
比较C风格的字符串。如果s1小于s2,则返回小于零的值。
还有一个提示:C风格的字符串是以空字符结尾的字符串(即字符串本身后面有一个零值),所以你需要一个大小至少为n + 1的数组来存储长度为n的字符串。在你的情况下,30是不够的,但31是。