在 Windows 或 Linux 上运行时函数的行为不同
Posted
技术标签:
【中文标题】在 Windows 或 Linux 上运行时函数的行为不同【英文标题】:Function behaves differently when run on Windows or Linux 【发布时间】:2018-10-27 23:00:33 【问题描述】:我有一个简单的功能,可以将文本行打印到控制台,居中,空白区域用“=”符号填充。当我在 Linux 上使用我的程序运行此功能时,我看到文本正确显示在控制台窗口的顶部,然后是我的程序的菜单提示,但在 Windows 上它什么也不打印并直接跳到菜单提示。这两个程序都使用带有 -std=c++11 的 GNU gcc 在代码块中编译和运行。
void _print_center(vector<string>& tocenter)
int center;
for ( int x; x<static_cast<int>(tocenter.size());x++ )
char sfill = '=';
string line = tocenter[x];
center = (68/2)-(tocenter[x].length()/2);
line.replace(0, 0, center, sfill);
cout << std::left << std::setfill(sfill);
cout << std::setw(68) << line << endl;
【问题讨论】:
int x
未初始化。你在这里依赖未定义的行为,理论上可以做任何事情(例如从这个星球的脸上抹去人类)。
@ArnavBorborah 谢谢!那成功了。你是对的:在尝试使用变量之前,我应该始终初始化它们。我真的很惊讶这可以在 any 系统上运行!
【参考方案1】:
您的问题得到了答案(未初始化的变量)。我建议你解开并简化你的代码,这样这类问题就不会经常出现。例如:
创建一个使单个字符串居中的函数。
void center( std::ostream& os, const std::string& text, int width )
if ( text.size() >= width )
// Nothing to center, just print the text.
os << text << std::endl;
else
// Total whitespace to pad.
auto to_pad = width - text.size();
// Pad half on the left
auto left_padding = to_pad / 2;
// And half on the right (account for uneven numbers)
auto right_padding = to_pad - left_padding;
// Print the concatenated strings. The string constructor will
// correctly handle a padding of zero (it will print zero `=`).
os << std::string( left_padding, '=' )
<< text
<< std::string( right_padding, '=' )
<< std::endl;
一旦您测试了该函数对单个字符串的良好运行,依靠 C++ 将其应用于字符串向量是微不足道的:
void center( std::ostream& os,
const std::vector< std::string >& strings,
int width )
for ( auto&& string : strings )
center( os, string, width );
无论你想使用std::string
,还是iomanip
,还是std::setfill
,都一样:不要在同一个函数中实现“迭代和格式化”。
【讨论】:
标记为答案,但这确实给我留下了更多问题。特别是关于您对汽车的使用。我不确定如何使用这种类型,或者我是否可以依赖它。示例:如果auto num;
不小心为其分配了string
或char
,那么当我尝试使用int
更改值时会发生什么?另外,我不知道for ( auto&& string : strings )
是什么。这就像通过引用传递,还是完全是别的什么?
关于答案:text.size()
在字符串上使用时是否与text.length()
一样工作?对于向量,text.size()
将给出元素的数量,而text[x].length()
将给出向量中该点处字符串的长度。
很抱歉使用了这么多相对新颖的功能:手指记忆。您正确地假设auto
并不总是一个好主意,但我发现它在大多数情况下都在做它应该做的事情。对于您的具体问题:您不能简单地做auto num;
然后分配您想要的任何内容(C++ 是一种 静态编译 语言;所有类型都必须在编译时知道)。你可以做的是auto x = 1;
,而x
是一个int:没有问题。
关于第二个问题:auto &&
将完成两件事。首先,它不会复制(它会取而代之的是参考)。其次,它将正确导出const-
ness(给我一个不可变的引用)。我在任何地方都使用它,除非我确定我需要一个可变引用或副本。
是的。它将逐个字符地迭代。阅读文档以了解范围,最重要的是,。你会成为一个更好的 C++ 程序员。以上是关于在 Windows 或 Linux 上运行时函数的行为不同的主要内容,如果未能解决你的问题,请参考以下文章
如何在 powershell 中检测 Linux 或 macOS 或 Windows?
是否可以在 Windows 上运行时从可执行文件中定位函数?
Windows主机上运行Azure IoT Edge的推荐方法
用于在运行时记录调用堆栈的库 (Windows/Linux)