扫描以空格分隔的数字

scanf for numbers separated by space

本文关键字:数字 分隔 空格 扫描      更新时间:2023-10-16

我知道用空格分隔的数字数量。以下代码在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

怎么了?

也许不同

平台的字位大小不同,你的向量中有 long 类型,你只读取int类型,它无法重写长变量的整个大小,你会得到一个长变量,其中一半的字节未初始化。

尝试更改:

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

到:

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

ld表示长十进制类型。

当我在 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>

作为附加的包含文件。

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

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