[英]Mysterious line break in cout statement
我编写了一个小片段来搜索数组中匹配的字符串,然后以格式精美的方式为并行 arrays 生成 output 结果。 但是,我必须对字符串输出的工作方式有一些基本的误解,因为在我的一生中,无论我将制表符、换行符放在哪里,或者是否在代码中使用endl
,我都无法正确地将其传递给 output。
下面是相关代码:
for (int i = 0; i < arrayCount; i++) {
if (arrayCopy[i].find(localString) != string::npos) {
cout << "\n\t"
<< array1[i] << " {"
<< subArray1[i] << ", "
<< subArray2[i] << "}";
}
}
我希望结果在每行的开头都有一个标签:
MatchedString1 {Data, MoreData} MatchedString2 {Data, MoreData} MatchedString3 {Data, MoreData}
相反,我得到如下结果,其中选项卡出现在空白行上(第一个结果除外):
MatchedString1 {Data, MoreData} MatchedString2 {Data, MoreData} MatchedString3 {Data, MoreData}
c++ 中存在什么让我如此痛苦的怪癖?!
使用以下来源重现您的问题:
$ cat test.cpp
#include <iostream>
#include <string>
int main() {
using std::cout;
using std::string;
const std::string array1[] = {"MatchedString1", "MatchedString2", "MatchedString3"};
const std::string arrayCopy[] = {"MatchedString1", "MatchedString2", "MatchedString3"};
const std::string localString = "String";
const std::string subArray1[] = {"Data", "Data", "Data"};
const std::string subArray2[] = {"More data", "More data", "more data"};
const unsigned int arrayCount = 3;
for (int i = 0; i < arrayCount; i++) {
if (arrayCopy[i].find(localString) != string::npos) {
cout << "\n\t"
<< array1[i] << " {"
<< subArray1[i] << ", "
<< subArray2[i] << "}";
}
}
}
编译并运行:
$ g++ test.cpp
$ ./a.out
MatchedString1 {Data, More data}
MatchedString2 {Data, More data}
MatchedString3 {Data, more data}
结论:
额外的换行符在您的数据中。
建议:
使用方括号来描述您的输入:
std::cout << "[" << array1[i] << "] {[" << subArray1[i] << "], [" << subArray2[i] << "]}" << std::endl;
剥离字符串:
如果您发现需要剥离字符串,您可能会发现以下函数很有用:
std::string lstrip(const std::string& s, const char* chars = " \t\r\n")
{
std::string::size_type begin = s.find_first_not_of(chars);
if (begin == std::string::npos)
{
return "";
}
return std::string(s, begin);
}
std::string rstrip(const std::string& s, const char* chars = " \t\r\n")
{
std::string::size_type end = s.find_last_not_of(chars);
return std::string(s, 0, end + 1);
}
std::string strip(const std::string& s)
{
return lstrip(rstrip(s));
}
像这样使用:
std::cout << "\t"
<< strip(array1[i]) << " {"
<< strip(subArray1[i]) << ", "
<< strip(subArray2[i]) << "}"
<< std::endl;
(重申我的评论作为可能的答案。)
标准方法是始终将\n
放在末尾,其他所有内容都按其出现的顺序放置。
我能想到的唯一会破坏它的是第二个和第三个匹配字符串开头的\r
。 (其他人正确地观察到双倍行距暗示输入开头的\n
。)
你确定这不仅仅是像"MatchedString"
实际上是"\nMatchedString"
的傻事吗? 你可以尝试在那里打印一些额外的东西来更清楚地描绘你的空白。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.