我应该编写一个代码,使用预先设置的名称将名称按字母顺序排列,这是我到目前为止所拥有的:
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main ()
{
const int NUM_NAMES = 20;
string temp;
string names [NUM_NAMES] = {"Collins, Phil", "Simpson, Bart", "Allen, Jim",
"Griffen, Jim", "Stamey, Marty" "Rose, Geri",
"Taylor, Swift","Johnson, Jill", "Alison, Jeff",
"Looney, Joe", "Wolfe, Bill", "James, Jean",
"Weaver, Jim", "Pore, Bob", "Rutherford, Greg",
"Ravens, Renee", "Harrison, Rose", "Setzer, Cathy",
"Pike, Gordon", "Holland, Beth" };
for (int k=0; k < NUM_NAMES; k++ )
{ for (int i=0; i<NUM_NAMES; i++)
{
if ( names[i] > names [i+1])
{
temp = names[i];
names [i] = names[i + 1];
names [i + 1] = temp;
}
}
}
cout << names [0] << endl;
int k = 1;
int i = 0;
while (k <= NUM_NAMES)
{
cout << names [i] << endl;
k++;
i++;
}
return 0;
}
它编译时没有错误但是当我尝试运行它时出现“Segmentation Fault(core dumped)”...正确方向的任何帮助都将受到赞赏
答案 0 :(得分:0)
你正在覆盖不属于你的记忆 - 在这一行:
names [i+1] = ...
在C ++(和许多其他语言)中,数组是从0
索引的。因此,大小为N
的数组对于从0
到N-1
的索引有效。您的for
循环遍历0
... NUM_NAMES - 1
,但在内部,您使用的索引i+1
为最后一次迭代NUM_NAMES
。
要解决此问题,您可以遍历1
... NUM_NAMES - 1
:
for (int k=1; k < NUM_NAMES; k++ )
继续names[i-1]
和names[i]
:
if ( names[i-1] > names [i])
{
temp = names[i - 1];
names [i - 1] = names[i];
names [i] = temp;
}
(或者保持现状,但将循环的执行条件更改为k < NUM_NAMES - 1
)
此外,而不是:
temp = names[i];
names [i] = names[i + 1];
names [i + 1] = temp;
你可以这样做:
std::swap(names[i], names[i + 1]);