这个程序给了我一个奇怪的错误,我根本无法弄清楚,它说了一些超出范围的对象。当我在没有std::cin >> firstLast;
的情况下运行此程序时,我只是将字符串firstLast硬编码为其他内容,它可以正常工作。我没有在任何地方看到这个,并且一直在寻找它为什么不起作用的日子。
#include "stdafx.h"
#include <string>
#include <iostream>
int main()
{
//Declaring firstLast string
std::string firstLast;
//Asking for input for last and first name (same string)
std::cout << "Enter your first and last name below." << "\n>>";
//Getting firstLast value from user
std::cin >> firstLast;
//This finds the space in the string so I can seperate the first and last name into different strings
int index = firstLast.find(' ');
/*
This makes a substring. The substring starts at index (the beginning of the surname) and goes on for the size of the surname (which is equal to the length of firstLast - first name length).
Ex: Name - "John Hopkins"
Length of "John" = 4
Length of " Hopkins" = firstLast.length() - 4
*/
std::string lastName = firstLast.substr(index, firstLast.length() - index);
//Printing the found surname
std::cout << "Your surname is " << lastName << "." << std::endl;
int rnd; std::cin >> rnd; return 0;
}
我真的不确定为什么这不起作用,如果我硬编码firstLast字符串,它可以工作,但是当我使用cin来获取字符串时, 它崩溃了,给了我 ERROR:
Unhandled exception at 0x7626D928 in Test.exe: Microsoft C++ exception: std::out_of_range at memory location 0x0018F374.
答案 0 :(得分:3)
int index = firstLast.find(' ');
从不在字符串中找到空格,因为
std::cin >> firstLast;
只能读取下一个空格。
要读取包含空格的字符串,请使用
std::getline(cin,firstLast);
代替。
如果您使用std::string::find()
函数,请在将string::npos
用作索引值之前检查结果。
答案 1 :(得分:1)
std::cin
会在看到空格之前进行读取。
因此,在您的情况下,如果您输入Joe Smith
,则firstLast
将包含单词Joe
,并且Smith
将位于等待提取的流中。< / p>
这意味着std::string::find
将返回std::string::npos
,这意味着您对std::string::substr
的调用将会出错。
为避免这种情况,您可以执行两次std::cin
次呼叫,分别获取名字和姓氏,或使用getline
检索整行。
答案 2 :(得分:0)
这里的问题是你使用cin来获取带空格的名字和姓氏。 但是cin的属性是它根据控制台中的空格字符来区分参数。
std::cin >> firstLast;
在此行之后,firstLast
将只有“名字”。如果您尝试提取姓氏,则此后的Sp将导致您的程序在下面的行中出错。
std::string lastName = firstLast.substr(index, firstLast.length() - index);
实施例: 如果你输入“Hello world”,它只会输入“你好”。
除此之外,您可以单独使用名字和姓氏。
希望这有帮助。