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(); 然而,阅读本书仍然很烦人,知道书中的代码总是不起作用:(
答案 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
,然后尝试将其转换为int
,short
,double
,unsigned 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 ++。