gpt4 book ai didi

c++ - 存取错误的问题(下方附有程式码)

转载 作者:行者123 更新时间:2023-12-02 10:33:02 25 4
gpt4 key购买 nike

您好,原谅我,如果没有正确询问,但是我的代码有问题。这是学校的一项任务,但是我在寻求帮助以了解问题而不是答案,因此我们将不胜感激。

我将在下面附上代码,运行时会给我一个我不明白的错误。我昨天与老师交谈过,他指出了我解决的问题,但又没有显示出来。

尽管我的代码中可能存在更多错误,但我想首先了解错误的访问错误。任何帮助,将不胜感激。

请告诉我将来如何更好地发布问题。

错误线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0):

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

vector<string> getVector(const string&);
string getName(const string&);
void selectionSort(vector<string>&);
bool search(const string&, const vector<string>&);
void displayResult(const string&, const string&, bool);
void writeToFile(const string&, const vector<string>&);
void reverseVector(vector<string>&);

int main()
{
string boyName, girlName;
bool boyNameFound, girlNameFound;


vector<string> boyNames(getVector("BoyNames.txt"));
vector<string> girlNames(getVector("GirlNames.txt"));


boyName = getName("boy's");
girlName = getName("girl's");

selectionSort(boyNames);
selectionSort(girlNames);

boyNameFound = search(boyName, boyNames);
girlNameFound = search(girlName, girlNames);

displayResult("boy's", boyName, boyNameFound);
displayResult("girl's", girlName, girlNameFound);

writeToFile("Boynames_asc.txt", boyNames);
writeToFile("Girlnames_asc.txt", girlNames);

reverseVector(boyNames);
reverseVector(girlNames);

writeToFile("Boynames_desc.txt", boyNames);
writeToFile("Girlnames_desc.txt", girlNames);

cout<<endl;

system("PAUSE");
return 0;
}


void selectionSort(vector<string> &arr)
{

int startScan, minIndex;
string minValue;

for (startScan = 0; startScan < (arr.size() - 1); startScan++)
{
minIndex = startScan;
minValue = arr[startScan];
for(int index = startScan + 1; index < arr.size(); index++)
{
if (arr[index] < minValue)
{
minValue = arr[index];
minIndex = index;
}
}
arr[minIndex] = arr[startScan];
arr[startScan] = minValue;
}


}// above is code the teacher provided
// below is where I have written code for the assignment
vector<string> getVector(const string& fileName)
{
string name;
ifstream file;
vector<string> namesFromFile;
file.open(fileName);
while(getline(file, name))
{
namesFromFile.push_back(name);
}
return namesFromFile;
}

string getName(const string& gender)
{
string nameChoice;

cout << "Enter a " << gender << " name, or N if you do not wish to enter a " << gender << " name: " << endl;
getline(cin, nameChoice);

return nameChoice;
}

bool search(const string& nameChoice, const vector<string>& names)
{


for(int i = 0; i < names.size(); i++)
{
if(nameChoice == names.at(i)) // names[i]
{

return true;

}

}
return false;
}

void displayResult(const string& gender, const string& names, bool nameFound)// change this function so either displays name found not found or chose //not to enter
{
if(nameFound)
{
cout << names << "is one of the most popular " << gender << "names." << endl;
}
else if(!nameFound)
cout << names << " is NOT one of the most popular " << gender << " names." << endl;

else if(names == "N")
{
cout << "You chose not to enter a " << gender << " name." << endl;
}

}

void writeToFile(const string& fileName, const vector<string>& names)
{

ofstream outputFile;
outputFile.open(fileName);
for(int i = 0; i < names.size(); i++)
{
outputFile << names[i] << endl;

}
}

void reverseVector(vector<string>& names)
{
string temp = 0;
for(int i = 0; i < names.size(); i++)
{
temp = names[0];
names[0] = names[names.size() - i];
names[names.size() - i] = temp;
}



}

最佳答案

error Thread 1: EXC_BAD_ACCESS (code=1, address=0x0):



这是由于您定义了reverseVector的缘故,有两个原因,第一个是 string temp = 0;,其中您将 char*初始化为NULL且 undefined 行为的字符串,只需要使用 string temp;
第二个是在第一个循环上,当我为0时,您可以访问 names[names.size()],因此在最后一个元素之后。此外, vector 中包含3个以上元素的算法是不正确的,因为您总是与 name[0]交换。您必须将 name[0]与名称[names.size()-1]交换 and名称 1 with names[names.size()-2]等,在我回答的最后将返回该功能

the teacher had written the selection sort function so I did not change it



因此,请与您的老师说他的函数假定 vector 不为空,并且当 vector 为空时,可以进行以下测试:

for (startScan = 0; startScan < (arr.size() - 1); startScan++)


始终为false arr.size()返回一个无符号的 size_t,因此当为空时,其值〜0u是 size_t的最大可能值。

说他混合(带符号的)int和(无符号的) size_t是错误的,并且通常由编译器发出信号,并且我们使用的是C++,而不是C,它们具有迭代器。

关于主要

为了避免selectionSort中的错误,请在调用 vector 之前检查 vector 是否为空,所以:
if (! boyNames.empty())
selectionSort(boyNames);
if (! girlNames.empty())
selectionSort(girlNames);

您在getName中具有特殊情况N,当输入名称为N时,您不得考虑输入:
if (boyName != "N") {
boyNameFound = search(boyName, boyNames);
displayResult("boy's", boyName, boyNameFound);
}

if (girlName != "N") {
girlNameFound = search(girlName, girlNames);
displayResult("girl's", girlName, girlNameFound);
}

注意主要做两次相同的事情,一次给男孩一次,给女孩一次,添加一个功能允许不重复所有代码。

但是看来主编也是由你的老师写的,真可惜。

在getVector中,当您无法读取文件时,可能会生成一条消息。为了帮助阅读代码,我鼓励您在每个声明部分之后添加一个空行,ifstream的构造函数允许打开文件,因此您可以
vector<string> getVector(const string& fileName)
{
string name;
ifstream file(fileName);
vector<string> namesFromFile;

while(getline(file, name))
{
namesFromFile.push_back(name);
}

return namesFromFile;
}

要么
vector<string> getVector(const string& fileName)
{
vector<string> namesFromFile;
ifstream file(fileName);

if (! file)
cerr << "cannot read " << fileName << endl;
else
{
string name;

while(getline(file, name))
{
namesFromFile.push_back(name);
}
}

return namesFromFile;
}

关于getName

它不会处理EOF情况,也不会处理没有名称为空或仅包含空格或在开头和/或结尾处都有空格的情况。

如果名称必须是唯一的单词,那么“John”而不是“John Doe”可以用 cin >> nameChoice;代替对getline的使用,如果EOF则强制为N:
string getName(const string& gender)
{
string nameChoice;

cout << "Enter a " << gender << " name, or N if you do not wish to enter a " << gender << " name: " << endl;
return (!(cin >> nameChoice)) ? string("N") : nameChoice;
}

如果可以组成名称,则在调用之后必须删除开头和结尾的空格,然后检查输入名称是否为空以强制N:
string getName(const string& gender)
{
string nameChoice;

cout << "Enter a " << gender << " name, or N if you do not wish to enter a " << gender << " name: " << endl;
getline(cin, nameChoice);

size_t b = 0;

for (;;) {
if (b == nameChoice.size())
return "N";
if (!std::isspace(nameChoice[b]))
break;
b += 1;
}

size_t e = nameChoice.size();

while ((e != 0) && std::isspace(nameChoice[--e]))
;

return (e >= b) ? nameChoice.substr(b, e - b + 1) : string("N");
}

因为教师代码中没有迭代器,所以在此及以后不再使用它们。
注意,也许您还必须将多余的空格删除为组合名称,我用“John Doe”替换“John Doe”?

关于搜索

名称 vector 被排序,这要归功于selectionSort的调用,因此如果名称小于 vector 中的名称,则在所有 vector 中进行搜索是没有用的
bool search(const string& nameChoice, const vector<string>& names)
{
for(size_t i = 0; i < names.size(); i++)
{
if(nameChoice == names[i])
{
return true;
}
if (nameChoice < names[i])
{
return false;
}
}
return false;
}

无论如何,即使是很小的优化,您的搜索仍然在O(N)中

与(sub) vector 的一半相比,您也可以在O(log(N))中进行更有效的搜索,这可以自己完成,也可以使用 std::binary_search进行:

关于displayResult

nameFound为true,为false,它不能为别的,所以您无法到达 else if(names == "N"),您需要首先检查该大小写,并且当您知道 if(!nameFound)为false时检查 if(nameFound)是没有用的,因此例如(使用名称而不是名称,因为只是一个名字):
void displayResult(const string& gender, const string& name, bool nameFound)// change this function so either displays name found not found or chose //not to enter
{
if(name == "N")
cout << "You choose to not enter a " << gender << " name." << endl;
else if(nameFound)
cout << name << " is one of the most popular " << gender << "names." << endl;
else
cout << name << " is NOT one of the most popular " << gender << " names." << endl;
}

要么
void displayResult(const string& gender, const string& name, bool nameFound)// change this function so either displays name found not found or chose //not to enter
{
if(name == "N")
cout << "You choose to not enter a ";
else
cout << name << " is" << ((nameFound) ? "" : " NOT")
<< " one of the most popular ";

cout << gender << " name." << endl;
}

关于writeToFile

就像ifstream一样,ofstream的构造函数允许打开文件

您不检查是否可以写入文件,这很危险,因为隐藏问题,例如最好这样做:
void writeToFile(const string& fileName, const vector<string>& names)
{
ofstream outputFile(fileName);

if (! outputFile)
cerr << "Cannot open " << fileName << " to write it" << endl;
else
{
for(size_t i = 0; i < names.size(); i++)
outputFile << names[i] << endl;
}
}

关于reverseVector

正如我所说的,它的定义不正确,他的简短方法是使用 std::reverse,否则请自己做:
void reverseVector(vector<string>& names) 
{
string temp;
size_t pos = 0, sup = names.size();

while ((pos + 1) < sup)
{
temp = names[pos];
names[pos++] = names[--sup];
names[sup] = temp;
}

for (auto s : names) cout << s << ' ';
cout << endl;
}

关于c++ - 存取错误的问题(下方附有程式码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61564467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com