正如你所看到的那样,即使有足够的空间,上部的暗X也会被切割.

发生这种情况是因为它们已经改变颜色并向后打印(从右到左).

这是一个错误,错误的代码,我的系统上的错误设置或(我怀疑它)它应该是什么样的?

以下是生成此输出的代码:

#include <Windows.h>
#include <iostream>
void moveto(int x,int y){
    COORD kord={x,y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),kord);
}
void setColor(WORD attributes){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),attributes);
}

void main(){
    for(int i=9;i+1;i--)
    {
        moveto(i,0);
        std::cout.put('X');
    }
    for(int i=-10;i;i++)
    {
        moveto(i+10,1);
        std::cout.put('X');
    }
    setColor(8);
    for(int i=9;i+1;i--)
    {
        moveto(i,2);
        std::cout.put('X');
    }
    for(int i=-10;i;i++)
    {
        moveto(i+10,3);
        std::cout.put('X');
    }
    setColor(7);
    for(int i=9;i+1;i--)
    {
        moveto(i,4);
        std::cout.put('X');
    }
    for(int i=-10;i;i++)
    {
        moveto(i+10,5);
        std::cout.put('X');
    }
    std::cin.get();
}

解决方法

这是Windows中的一个错误.

如Hans Passant勘误表中所述:

I repro too,VS2008 on Win7. Cool bug. Changing the console font fixes it.

让我们使用这个bug隔离.我将此字体识别为Petite Terminal,这意味着您最有可能将此项目配置为Win32控制台应用程序. GCC的额外repro确认了这一假设,从实际角度来看,我们将假设你们所有人都在Windows终端内部运行32位控制台应用程序.

问题变成了为什么它在默认终端字体,颜色8和向后写入console screen buffer.的上下文中正好写了一个额外的像素列

具体来说,让我们将这个问题分解为其组成部分:

>发出写入时,会将字符写入终端阵列中的某个位置
>选择默认颜色(7)时,像素不会溢出到阵列中的其他缓冲区
>选择颜色8时,会将另一列像素写入缓冲区的下一个区域,只有在向后背诵文本时才能看到

由于(3)中存在溢出,这是一个错误.

Quoting Raymond Chen:

The console rendering model assumes each character fits neatly inside
its fixed-sized cell. When a new character is written to a cell,the
old cell is overprinted with the new character,but if the old
character has overhang or underhang,those extra pixels are left
behind since they “spilled over” the required cell and infected
neighbor cells. Similarly,if a neighboring character “spilled over”,
those “spillover pixels” would get erased.

The set of fonts that Could be used in the console window was trimmed
to the fonts that were tested and kNown to work acceptably in console
windows. For English systems,this brought us down to Lucida Console
and Terminal.

“Well,that’s stupid. You should’ve stopped me from choosing a font
that so clearly results in nonsense.”

And that’s what we did.

并不是说我把雷蒙德归咎于雷蒙德,但他权威地将此描述为“不可能发生”.

Windows的控制台字体的选择和测试应该已经抓住了这一点.事实上它甚至是一个问题都是一种失常.

c – 字符在更改颜色并向后打印时重叠的更多相关文章

  1. c – 为什么我应该在使用命名空间std之后包含头文件?

    由于命名空间std已经有包含函数定义的c库,那么为什么我们在它上面包含头文件?

  2. c – 如何制作“std :: cout &lt;&lt; 123456789.12”print“123456789.12”?

    我该怎么做打印这个:它始终打印这个:我知道我必须玩旗帜,但我无法弄清楚正确的组合.如果我设置固定标志,则打印解决方法您可以使用:基本上limitspackage具有所有内置类型的特征.浮点数(浮点数/双/长双精度)的特征之一是digits10attribute.这定义了基数10中浮点数的精度.现场观看:http://ideone.com/Ity9m7要继续阅读,请查看另一个类似的问题:HowdoI

  3. c – 为什么我们需要绑定std :: cin和std :: cout?

    默认情况下,标准输入设备与标准输出设备绑定在一起,格式如下:std::cin.tie;这保证输入缓冲区在调用输入之前被刷新.所以我试图通过使用std::cin.tie来解开它们,但似乎结果与绑定没有任何区别.我测试错了吗?为什么我们需要把它们捆在一起?他们共享相同的缓冲区吗?

  4. c – cout &lt;&lt; setw不能与åäö正确对齐

    以下代码重现了我的问题:这产生以下输出:如果我将代码中的“”更改为例如“ABC”,那么它的作品:为什么会发生这种情况?解决方法随着std::cout与正确的区域设置,你可能也必须切换到宽字符串.例如:Demo

  5. 什么时候使用cerr和cout在C?

    我正在寻找一个区分C中cerr和cout的例子?我什么时候需要使用cerr?

  6. c – 输出到字符串的cout相当于什么?

    我应该知道这个但是…printf是sprintf,因为cout是____?

  7. c – 将std :: cout的副本重定向到该文件

    我需要将std::cout的副本重定向到该文件.即我需要在控制台和文件中看到输出.如果我用这个:然后我将字符串写入文件,但我在控制台中看不到任何内容.我该怎么做?

  8. c – 字符在更改颜色并向后打印时重叠

    正如你所看到的那样,即使有足够的空间,上部的暗X也会被切割.发生这种情况是因为它们已经改变颜色并向后打印.这是一个错误,错误的代码,我的系统上的错误设置或它应该是什么样的?

  9. c – GCC / g cout &lt;&lt;与printf()

    >为什么printf最终使用汇编代码中的更多cpu指令而不是cout

  10. 使用C库时如何避免包含相同的代码?

    如果是的话,它是一个问题吗?如果是,那我该如何避免呢?

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部