在C ++中的标准模板库中使用merge()函数时输出奇怪

时间:2018-12-03 16:12:09

标签: c++ algorithm merge stl

// merge.cpp
// merges two containers into a third
#include <iostream>
#include <algorithm> //for merge()
using namespace std;
int src1[] = { 2, 3, 4, 6, 8 };
int src2[] = { 1, 3, 5 };
int dest[8];
int main()
{ //merge src1 and src2 into dest
    merge(src1, src1+5, src2, src2+3, dest);
    for(int j=0; j<8; j++) //display dest
    cout << dest[j] << '  ';
    cout << endl;
    return 0;
}

这是我键入的代码,我期望的是排序后的合并数组,但是输出结果是:

1210537622105376321053763210537642105376521053766210537682105376

我改变了数据,重新检查了语法,但我认为一切都很好

3 个答案:

答案 0 :(得分:6)

在c ++中,这是一个字符' '(单引号),而这是一个字符串" "(双引号)。避免在实现定义中使用多个引号。

修复

cout << dest[j] << '  ';

cout << dest[j] << ' '; // remove one whitespace

cout << dest[j] << "  "; // change to string

多字符字符常量被解释为整数。在您的情况下,' '2105376。使用g ++和clang ++,' '被转换为8224 = 256 * ' ' + ' '。在您的示例中,您忘记了一个空格,或者编译器使用另一种方法进行翻译:{{1​​}}

启用和读取编译器警告。这是编译器告诉我的第一件事。

2105376 = 256 * 256 * ' ' + 256 * ' '+ ' '

答案 1 :(得分:6)

' '是一个多字符文字,因为它包含多个字符。尽管int是常见的,但它是256 * ' ' + ' '类型,具有实现定义的值。因为它是int,所以使用了与ostream不同的char重载,这说明了您的输出。

改为使用" "

答案 2 :(得分:0)

此代码中的错误非常明显。但是,如果将来有人需要它,我可以告诉您我在这段代码中犯了什么错误。

错误位置

cout << dest[j] << '  '; //<----------the mistake is here,

理论

在c / c ++中,单引号用于包含单个字符。 像'c'一样,'+'也类似' '

c / c ++中的空白被视为单个字符。 双引号用于包围多字符字符串。

解决方案

因此,可以将''替换为" ",或者将' '(两个空格)替换为' '(单个空格)。