什么会导致死亡<<变量& lt; & lt;“ t";当输出超过终端宽度时,打印空白而不是值

What can cause cout << variable << " "; to print blankspace instead of a value, when the output exceeds terminal width?

本文关键字:lt 终端 打印 空白 变量 输出 什么 quot      更新时间:2023-10-16

我有一系列三个循环,每个循环包含一行t分隔值

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;
struct the_struct {
    float a_float;
    the_struct() :a_float(0){}
};
class the_class {public: the_struct a_struct;};
int main ()
{ 
    vector <the_class> v_objects;
    for(int q=0; q < 30; q++)
        v_objects.push_back(the_class());
    srand(0);
    int* int_dynamic_array = new int [30];
    for(int q=0; q < 30; q++)
        int_dynamic_array[q] = rand() % 30;
    for(int q=0; q < 30; q++)
        cout << q << "t";
    cout << "n";
    for(int q=0; q < 30; q++)
        cout << v_objects[q].a_struct.a_float << "t";   //at runtime, these are all zeros
    cout << "n";
    for(int q=0; q < 30; q++)
        cout << int_dynamic_array[q]  << "t";           //random values between 0 and 29 
    cout << "n";
}

由于某种原因,这段代码只打印了第二个循环中的11个值,并随机省略了第三个循环中的0到4个值。第一个循环从来没有问题。例如(不带制表符):

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  
0 0 0 0 0 0 0 0 0 0 0   
4 7 2 9 7 4 3 1 6 5 26 12 8  28 13 11 22 7  19 2  26 13 9  12 15 24 8    

奇怪的是,如果我将选项卡字符串从"t"修改为"xt",程序现在输出每个值,但显然每个值后面都有一个x。例如:

0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 

正如在问题下面的评论中讨论的那样,这似乎是Mac终端中的一个错误/怪癖(我认为是错误,但我不知道Posix规范是否对制表符和终端右侧之间的允许交互有一些奇怪的规定)。

如果第11个值是个位数(0是),那么至少在我的终端上设置了制表符停止符,这样当终端正好在行结束时输出制表符。如果第11个值是两位数字[*],那么它跨行,因此制表符不在行尾。显然,这个不应该是一个问题,我只是有一种预感,它可能是。

我在我的终端上没有看到相同的结果(这不是Mac,它实际上是Windows上的putycyg) -对我来说,输出该选项卡将光标移动到下一行,正如您所期望的那样。

[*]哪10是,所以是0x,所以是26,第11个值你从rand() % 30在你的机器上播种srand(0)

虽然问题似乎是关于输出的,但可能还有另一种情况需要考虑。

在v_objects[q]中,如果v_objects是类的实例,该类重载了[]操作符,该操作符接受int的引用,那么q的值可能会在那里增加/改变,这将导致for循环比预期提前退出。

例如:

some_type operator[] ( int &a )
{
    // a can be incremented here
    a++;
}

由于你方没有给出完整的来源,我们无法找到确切的原因。

输出在那里,这是命令行输出屏幕的问题,如果你只做

美元。/。Out> op.txt

并打开输出文件,您将看到输出非常多。

如果你将制表符间距改为新行

"t"到"n",然后你也可以在屏幕上看到输出。

但是我同意在使用制表符

时命令行输出屏幕有一些问题编辑:

问题是控制台窗口的大小。

size为62*40;0个数= 9

size为90*40;0个数= 13

,尺寸为120*40;0个数= 16

,尺寸为150*40;0个数= 20

和使用我的监视器,我得到所有的…

,尺寸260*40;0个数= 30

可能您忘记了输出末尾的std::endlstd::flush。简单地输出`n'不足以刷新输出,因此您将得到一个简短的输出。

添加x可以工作的情况可能是由于内部缓冲区已满(然后输出),因为x将输出的大小增加到导致当前缓冲区输出的限制(当缓冲区较短而没有x时不会发生)。

编辑:

作为问题的作者说,它不与刷新工作,那么,我唯一想到的是,其中一些字段是字符或字符串,它们可能是空的,或者已经无意中填充了空格。(这就是为什么显示这些类型的定义很重要的原因)。