代码在visual c ++中无法正常工作(来自bjarne stroustrup编程和原理书2n版本的示例)

时间:2017-05-21 08:02:12

标签: c++ c++11 visual-c++ c++17

Okey,因为我最近开始阅读有关C ++的内容,并尝试使用我正在编写的程序原理和练习使用C ++第二版的书。

我是一个全新的人,所以这可能就是原因,但这里就是这样。

Okey所以在书中他们你实现了一个头文件.h文件,而不是(iostream)等。所以它只是有所有那些开始,因为这本书不希望我们在开始时专注于那些库学习。 所以我实现了它并使用它(不确定这是否与问题有关)。无论如何,在第77页,我被卡住了。

基本上它是一个错误的值,它被输入并且它应该只显示-1(或0),因为int得到一个假值,等等Carlos(字母,而不是整数)所以int没有得到正确的值所以应该工作的代码(并显示0或-1,因为它输入的值不正确)是根据这本书:

#include "std_lib_facilities.h"


using namespace std;

int main()
{

cout << "Please enter your first name and age\n";
string first_name = "???"; // string variable // ("???” means “don’t know the name”)
int age = –1; // integer variable (–1 means “don’t know the age”)
cin >> first_name >> age; // read a string followed by an integer
cout << "Hello, " << first_name << " (age " << age << ")\n";
}

这就是我写的:

#include "std_lib_facilities.h"


using namespace std;

int main()
{
cout << "Please enter your first name and age" << endl;
string First_Name = "???";
int Age = -1;
cin >> First_Name >> Age;
cout << "Hello, " << First_Name << "(age" << Age << ")" << endl;
keep_window_open();
return 0;
}

但是,对于我而言,使用visual c ++的结果是崩溃,例如我写了22个Carlos。 根据这本书,它应该输出Hello,22(年龄-1)

但对我而言,在我输入卡洛斯这个词作为年龄的价值后,它就崩溃了...... 当我运行并编译它时,我没有得到任何错误或任何错误,但是当我给出年龄的假值时它会崩溃。

我做错了什么? 添加:我知道我可以使用一个字符串来使它工作,但是我只是感兴趣为什么它不起作用,因为我正在遵循这本书我希望遵循它而不会遇到这些问题,因为它的意图是工作

当我这样做时,这是一个gif: http://imgur.com/a/ERjhz 解决方案:使用系统(“暂停”);而不是keep_window_open(); 然而,阅读本书仍然很烦人,知道书中的代码总是不起作用:(

4 个答案:

答案 0 :(得分:1)

嗯,这不是问题,但太快,不能被我们的眼睛注意到。

我正在添加keep_window_open()

的函数定义
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/0.4.2/leaflet.draw.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/0.4.2/leaflet.draw.js"></script>

正如您所看到的那样,只需从美国输入字符 转发您将了解输入流及其缓冲区 因此,当您输入一个字符代替整数时,流(背景)中会标记错误,并且使用唯一一个字符输入(在您的情况下,'C'用于标记)。

我正在使用输入作为Carlos 22

所以现在输入流仍然有字符'a','r','l','o','s',22 所以现在'a'用作 keep_window_open 功能的输入 并且程序结束而不等待您的输入 所以没有错误或崩溃,但因为该字符已经存在keep_window_open函数的输入所以它真的很快

答案 1 :(得分:0)

问题出在keep_window_open。这是一个非常难以绝对正确的棘手功能。您可以使用此代码替换它来回避问题但仅适用于Windows:

inline void keep_window_open()
{
   system("pause");
}

或者这个稍微复杂的代码试图考虑更多的案例:

inline void keep_window_open()
{
    cout << "Please enter a character to exit\n";
    if (!cin)
    {
        cin.clear();
        cin.ignore(120, '\n');
    }
    char ch;
    cin >> skipws >> ch;
}

(假设您没有输入超过120个字符的行。如果您希望它不受任意限制,请将120替换为numeric_limits<streamsize>::max()。std_lib_facilities.h中的其他函数在这种情况下使用120你很多或者可能不需要在你的程序中添加#include <limits>指令。)

我已经在几个案例中进行了测试,它似乎与程序的正确和错误输入一起使用,但使用它需要您自担风险。如果您的程序需要更复杂的输入,它仍然可能正常工作,也可能无法正常工作。

答案 2 :(得分:-1)

一个好的规则是总是除了最终用户是白痴之外,所以你需要以一种能够处理各种输入而不会崩溃的方式编写程序。因此,请始终将输入数字读为std::string,然后尝试将其转换为intshortdoubleunsigned int或您正在使用的数据类型。

您的代码应如下所示:

#include <cstdlib>
#include <exception>
#include <iostream>
#include <stdexcept>
#include <string>

int main(int argc, char **argv)
{
    int age;
    std::string first_name;
    std::string input_age;

    std::cout << "Please enter your first name and age: " << std::endl;
    std::cin >> first_name >> input_age; // Read the age as 'std::string'

    try
    {
            age = std::stoi(input_age); // Try to convert age from 'std::string' to 'int'
            std::cout << "Hello, " << first_name << " (" << age << ")" << std::endl;
    }
    catch(std::invalid_argument& ex) // 'std::stoi()' will throw 'std::invalid_argument' if it's not able to convert 'std::string' to 'int'
    {
            std::cerr << "Unable to convert input value ('" << input_age << "') to 'int'" << std::endl;
            std::cerr << "Debug info: " << ex.what() << std::endl;
    }
    catch(std::out_of_range& ex) // 'std::stoi()' will throw 'std::out_of_range' if 'std::string' is too small or too big to store in a 'int'
    {
            std::cerr << "The input value (" << input_age << ") is out of range, please input a value inside the range" << std::endl;
            std::cerr << "Debug info: " << ex.what() << std::endl;
    }

    return EXIT_SUCCESS;
}

答案 3 :(得分:-4)

所以它与代码无关,而是与输入有关。

  

当我例如写22卡洛斯时。

问题是代码要求{ "version": "0.1.0", "command": "make", "isShellCommand": true, "tasks": [ { "taskName": "Makefile", // Make this the default build command. "isBuildCommand": true, // Show the output window only if unrecognized errors occur. "showOutput": "always", // No args "args": ["all"], // Use the standard less compilation problem matcher. "problemMatcher": { "owner": "cpp", "fileLocation": ["relative", "${workspaceRoot}"], "pattern": { "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5 } } } ] } 然后First_Name,而不是Age然后Age。所以当你为First_Name 加上 22时,.exe就会感到困惑。

例如,假设我这样做了

First_Name

当我运行程序并将其输入

int y = 0;
cout << "Give me INT: ";
cin >> y;
cout >> "You put: " >> y;

这是一个问题,因为用户在代码要求int时会给出一个字符串。

所以对于你的情况,不要写 22 Carlos ,只需写 Carlos 22 。 另外请记住,这本书可能不太正确,因为它不应该打印出 Hello,(22)。现在,如果发生这样的事情就像崩溃一样,也许它是旧版本的C ++。