C++ 为什么我的程序抛出异常?
C++ Why is my program throwing an exception?
我是编程新手,我正在尝试编写一个从列表中获取最短字符串的函数,但每次我 运行 它时,visual studio 都会显示错误 "Exception thrown: read access violation".哪里错了?
#include <iostream>
#include <string>
using namespace std;
const string &shortest_string(initializer_list<string> strings) {
string *shortest_one = nullptr;
for (string string : strings) {
if (shortest_one == nullptr) shortest_one = &string;
else {
if (string.size() < shortest_one->size()) shortest_one = &string;
}
}
return *shortest_one;
}
int main() {
cout << shortest_string({ "hello" , "my", "name", "is", "dan" }) << endl;
return 0;
}
if (shortest_one = nullptr)
不是比较运算。这是一个 赋值 ,它将 shortest_one
设置为 nullptr
。此操作的计算结果为 0,因此 if
表达式等效于 if (0)
或 if (false)
.
然后在 else
块中,您正在使用 shortest_one->size()
但 shortest_one
为空...
尝试使用 if (shortest_one == nullptr)
。
您创建了名称与类型名称匹配的变量(字符串变量,字符串类型?)。另外还有一个问题,你 return 指向具有局部生命范围的对象的指针。那就是UB。使用迭代器,您的函数将像这样工作:
const string shortest_string(initializer_list<string> strings) {
if(!strings.size()) return string();
auto shortest_one = strings.begin();
for (auto it = shortest_one+1; it < strings.end(); it++ )
{
shortest_one = (it->size()< shortest_one->size()) ? it : shortest_one;
}
return *shortest_one;
}
我是编程新手,我正在尝试编写一个从列表中获取最短字符串的函数,但每次我 运行 它时,visual studio 都会显示错误 "Exception thrown: read access violation".哪里错了?
#include <iostream>
#include <string>
using namespace std;
const string &shortest_string(initializer_list<string> strings) {
string *shortest_one = nullptr;
for (string string : strings) {
if (shortest_one == nullptr) shortest_one = &string;
else {
if (string.size() < shortest_one->size()) shortest_one = &string;
}
}
return *shortest_one;
}
int main() {
cout << shortest_string({ "hello" , "my", "name", "is", "dan" }) << endl;
return 0;
}
if (shortest_one = nullptr)
不是比较运算。这是一个 赋值 ,它将 shortest_one
设置为 nullptr
。此操作的计算结果为 0,因此 if
表达式等效于 if (0)
或 if (false)
.
然后在 else
块中,您正在使用 shortest_one->size()
但 shortest_one
为空...
尝试使用 if (shortest_one == nullptr)
。
您创建了名称与类型名称匹配的变量(字符串变量,字符串类型?)。另外还有一个问题,你 return 指向具有局部生命范围的对象的指针。那就是UB。使用迭代器,您的函数将像这样工作:
const string shortest_string(initializer_list<string> strings) {
if(!strings.size()) return string();
auto shortest_one = strings.begin();
for (auto it = shortest_one+1; it < strings.end(); it++ )
{
shortest_one = (it->size()< shortest_one->size()) ? it : shortest_one;
}
return *shortest_one;
}