【问题标题】:Character variable not getting printed correctly while using cin and cout使用 cin 和 cout 时字符变量未正确打印
【发布时间】:2019-07-09 21:52:59
【问题描述】:

我必须编写一个程序,它接受一个由以下空格分隔的值组成的输入:int、long、char、float 和 double,然后在输出的新行中打印每个值。

当我使用 printf 和 scanf 编写程序时,它工作得非常好。

#include<stdio.h>
int main()
{
    int a;
    long b;
    char c;
    float d;
    double e;
    scanf("%d %ld %c %f %lf", &a, &b, &c, &d, &e);
    printf("%d\n%ld\n%c\n%f\n%lf", a, b, c, d, e);
    return 0;
}

但是当我使用 cin 和 cout 时,出现了一些问题。当 long 输入的数字大于 LONG_MAX 时会发生这种情况。

#include<iostream>
using namespace std;
int main()
{
    int intNumber;
    long longNumber;
    char character;
    float floatNumber;
    double doubleNumber;
    cin>>intNumber>>longNumber>>character>>floatNumber>>doubleNumber;                
    cout<<intNumber<<"\n"<<longNumber<<"\n"<<character<<"\n"<<floatNumber<<"\n"<<doubleNumber;
   return 0;
}

例如,如果输入是211916801 97592151379235457 p 19856.992 -5279235.721231465,那么第一个程序的输出是

211916801
97592151379235457
p
19856.992
-5279235.721231465

但是,第二个节目出来了

211916801
2147483647
╠
-1.07374e+08
-9.25596e+61

这里到底发生了什么?

【问题讨论】:

  • long 看起来被视为intchar 看起来像是编码问题。 printf 没有这些问题,因为 printf 中的格式说明符知道该怎么做。
  • 我认为cin&gt;&gt;longNumber 的输入超出范围后放弃了(假设long 对于此编译器是32 位)。尝试初始化变量以查看在cout&lt;&lt; 时哪些变量仍具有初始值(并且尚未被cin&gt;&gt; 更新)。

标签: c++ input output long-integer


【解决方案1】:

istream::operator&gt;&gt; function 调用std::num_get::get function,后者调用std::num_get::do_get 函数。

do_get 函数分三个阶段进行解析,对于stage 3 (conversion and storage) 有这样的注释:

如果转换函数导致正值太大而无法适应v 的类型,则将最正可表示的值存储在v

[注意:v 是目标变量]

这解释了该值会发生什么,以及为什么您会为 long 值获得 2147483647。我们也可以说你在一个long的大小仍然是32位的系统上。

第 3 阶段的笔记列表继续:

无论如何,如果转换函数失败,std::ios_base::failbit 被分配给err

这就解释了其他值会发生什么。一旦设置了failbit,您将无法从输入流中读取更多内容,直到您清除状态。


此外,如果我们回到 operator&gt;&gt; reference,我们会看到 C++98 和 C++03

如果提取失败...值保持不变并设置failbit

对于 C++11 及更高版本

如果提取失败,则将零写入值

由于设置 failbit 后的变量不为零,因此我们可以推断您正在使用 C++11 之前的编译器构建它。您打印的值是不确定的未初始化内容。甚至阅读不确定的内容也会导致undefined behavior

【讨论】:

  • 在这种情况下,scanf() 是如何完美运行的?
  • @SaurabhPrakash 因为scanf 函数不像 C++“输入”运算符那样工作。
【解决方案2】:

您输入的长数超出了 MAX_LONG = 2147483647。所以在这种情况下是溢出问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2018-09-25
    相关资源
    最近更新 更多