0

我知道用空格分隔的数字数量。以下代码确实适用于 Windows,但不适用于 Linux。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
    ios_base::sync_with_stdio(0);
    unsigned long k,p,q, all;


    cin >> k >> p >> q; 
    vector<long> klo(k);
    all = 0;
    for(unsigned long i = 0;i<k;i++){   
        scanf("%d", &klo[i]);
        all += klo[i];
    }
}

正如我所说,在 Windows 下完美运行,但 Linux 分配了一些随机值:-1220155675-1220155675-12201556750

怎么了?

4

3 回答 3

4

也许平台之间的字位大小不同,您的向量中有 long 类型并且您是只读int类型,这无法重写 long 变量的整个大小,您将获得一个 long 变量,其中一半字节未初始化。

尝试改变:

scanf("%d", &klo[i]);

进入:

scanf("%ld", &klo[i]);

ld表示长十进制类型。

于 2013-11-02T14:07:23.780 回答
3

%d用于阅读 int。您正在尝试阅读很长的内容 - 那将是%ld

C++ IO 系统的优点之一是cin >> klo[i]可以为这两种类型做正确的事情。

于 2013-11-02T14:09:08.623 回答
3

当我在 Linux 上编译你的代码时,它给了我以下错误:

$: /tmp$ g++ -g foobar.c
foobar.c: In function ‘int main(int, char**)’:
foobar.c:17:28: warning: format ‘%d’ expects argument of type ‘int*’, but argument 2 has type ‘long int*’ [-Wformat=]
         scanf("%d", &klo[i]);
                            ^

我将其更改为scanf ( "%ld", &klo[i] );并且有效。窗户是宽容的。我还必须添加

#include <stdio.h>

作为附加的包含文件。

于 2013-11-02T14:11:00.550 回答