在 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; 不小心为其分配了stringchar,那么当我尝试使用int 更改值时会发生什么?另外,我不知道for ( auto&amp;&amp; string : strings ) 是什么。这就像通过引用传递,还是完全是别的什么? 关于答案:text.size() 在字符串上使用时是否与text.length() 一样工作?对于向量,text.size() 将给出元素的数量,而text[x].length() 将给出向量中该点处字符串的长度。 很抱歉使用了这么多相对新颖的功能:手指记忆。您正确地假设auto 并不总是一个好主意,但我发现它在大多数情况下都在做它应该做的事情。对于您的具体问题:您不能简单地做auto num; 然后分配您想要的任何内容(C++ 是一种 静态编译 语言;所有类型都必须在编译时知道)。你可以做的是auto x = 1;,而x 是一个int:没有问题。 关于第二个问题:auto &amp;&amp; 将完成两件事。首先,它不会复制(它会取而代之的是参考)。其次,它将正确导出const-ness(给我一个不可变的引用)。我在任何地方都使用它,除非我确定我需要一个可变引用或副本。 是的。它将逐个字符地迭代。阅读文档以了解范围,最重要的是,。你会成为一个更好的 C++ 程序员

以上是关于在 Windows 或 Linux 上运行时函数的行为不同的主要内容,如果未能解决你的问题,请参考以下文章

如何在 powershell 中检测 Linux 或 macOS 或 Windows?

是否可以在 Windows 上运行时从可执行文件中定位函数?

Windows主机上运行Azure IoT Edge的推荐方法

用于在运行时记录调用堆栈的库 (Windows/Linux)

PHP 脚本 - 检测是不是在 linux 或 Windows 下运行?

在 Windows 上开发并在 linux 机器上运行