程序无法打印必需字符串

时间:2016-02-15 18:17:14

标签: c++ unhandled-exception

这个程序给了我一个奇怪的错误,我根本无法弄清楚,它说了一些超出范围的对象。当我在没有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.

3 个答案:

答案 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”,它只会输入“你好”。

除此之外,您可以单独使用名字和姓氏。

希望这有帮助。