【发布时间】:2019-06-12 13:12:50
【问题描述】:
我正在使用带有特殊字符的 c++ 字符串进行控制台输出。大部分结果是可以预测的,但其中一个结果却出乎我的意料。我在任何地方都找不到答案。
平台: Windows 7 企业版 6.1(内部版本 7601:Service Pack 1) 编译器: g++ (GCC) 8.2.0, c++17
#include <iostream>
int main(){
using namespace std;
char numString[12] = "0123456789\n";
//This is group 1
numString[3] = '\t';
numString[4] = '\b';
cout << "Group 1 output:\n" << numString << endl;
//This is group 2
numString[3] = '\b';
numString[4] = '\t';
cout << "Group 2 output:\n" << numString << endl;
//This is group 3
numString[3] = '\n';
numString[4] = '\b';
cout << "Group 3 output:\n" << numString << endl;
//This is group 4
numString[3] = '\b';
numString[4] = '\n';
cout << "Group 4 output:\n" << numString << endl;
//This is group 5
numString[2] = '\b';
numString[3] = '\b';
numString[4] = '\n';
cout << "Group 5 output:\n" << numString << endl;
return 0;
}
控制台输出:
第 1 组输出: 01256789 第 2 组输出: 01 56789 第 3 组输出: 012 56789 第 4 组输出: 012 56789 第 5 组输出: 01 56789第 4 组输出预期为,
第 4 组输出: 01 56789虽然输出实际上是,
第 4 组输出: 012 56789我不明白为什么字符“2”仍然存在。
谁能帮我理解这个问题? 谢谢。
看了下面的回答,尤其是zar的回答,相信我已经明白了问题所在,在这里稍微总结一下。
- 当未检测到物理击键时,Windows cmd 控制台处于非破坏性模式。
- 任何新输出都会从当前光标开始覆盖现有输出。听起来多余但必要。如果有任何新字符输出,它将覆盖现有字符,直到用完新字符。如果还有更多现有字符,它们将继续存在在那里,并且可能看起来像新字符后面的“输出”。
- '\b' 只将光标移动一个字符。它不会删除任何内容。
- '\n' 仅将光标移动 到下一行。它不会将其后面的任何字符移动到下一行。
- '\r' 仅将光标移动到当前行的开头。
请注意移动光标。
我想在这里粘贴所有代码:
//strwithspecialchar.cpp -- Understand special characters in C++ string
#include <iostream>
int main(){
using namespace std;
char numString[12] = "0123456789\n";
//This is group 1
numString[3] = '\t';
numString[4] = '\b';
cout << "Group 1 output:\n" << numString << endl;
//This is group 2
numString[3] = '\b';
numString[4] = '\t';
cout << "Group 2 output:\n" << numString << endl;
//This is group 3
numString[3] = '\n';
numString[4] = '\b';
cout << "Group 3 output:\n" << numString << endl;
//This is group 4
numString[3] = '\b';
numString[4] = '\n';
cout << "Group 4 output:\n" << numString << endl;
//This is group 5
numString[2] = '\b';
numString[3] = '\b';
numString[4] = '\n';
cout << "Group 5 output:\n" << numString << endl;
//This is group 6
numString[2] = '\b';
numString[3] = '3';
numString[4] = '\n';
cout << "Group 6 output:\n" << numString << endl;
//This is group 7
numString[2] = '2';
numString[3] = '\b';
numString[4] = '\a';
cout << "Group 7 output:\n" << numString << endl;
//This is group 8
numString[3] = '\b';
numString[4] = '\r';
cout << "Group 8 output:\n" << numString << endl;
//This is group 9
numString[3] = '\b';
numString[4] = '\n';
numString[8] = '\r';
cout << "Group 9 output:\n" << numString << endl;
return 0;
}
为了更好地理解这些特殊字符,下面的输出:
第 1 组输出: 01256789 第 2 组输出: 01 56789 第 3 组输出: 012 56789 第 4 组输出: 012 56789 第 5 组输出: 01 56789 第 6 组输出: 03 56789 第 7 组输出: 0156789 第 8 组输出: 56789 第 9 组输出: 012 967【问题讨论】:
-
第四组没有变化
numString[2]。这只发生在第 5 组 -
无法重现输出:godbolt。 (第二行)。
-
不确定
\n的输出是否会覆盖显示的字符。 -
另请注意,在大多数控制台上,
\b是非破坏性退格键。 -
关于您的“组”的实际输出不是很清楚。也许字符串末尾的第二个换行符会使它更清晰?或者打印一个标题,比如
std::cout << "\nGroup X\n" << numString;(你用“组”号替换X)。
标签: c++ string special-characters