c / c ++ scanf / cin从多行读取int

时间:2013-08-04 21:01:49

标签: c++ c

我正在用c / c ++进行一些基本的输入解析。

格式:值的数量,后跟空格分隔值:

3
5 2 4

这里的问题是第一行之后缺少空格。这会导致cin和scanf将35读入第一个变量,而不是3.

int num;

scanf("%d", &num);

int array[num];
for (int i = 1; i <= num; i++) {
    scanf("%d", &array[i]);
}

如何让cin或scanf停止在换行符解析?

编辑: 在读取之前,即使将它们写入以后,初始化变量是不是很糟糕? (int num

如果我输入输入,它会起作用,但如果我粘贴输入则不行。任何线索?

8 个答案:

答案 0 :(得分:4)

std::cin将换行符解释为空格,因此您使用的文件可能包含换行符之外的其他内容。您还使用非标准扩展来声明数组。这不是便携式的,并不保证所有编译器都支持。我建议你转而使用std::vector

您的for循环也不正确。 Array使用基于零的索引来访问其元素。因此,您最终将访问数组越界,这是未定义的行为。这意味着您的程序可能会崩溃,它可能会覆盖其他变量,或者您可能根本没有注意到任何症状。如果覆盖其他变量,这也可能导致您遇到的症状。

下面的示例使用C ++输入流而不是scanf来提供更好的错误检查。

#include <istream>
#include <vector>

std::vector<int> load(std::istream& in)
{
    std::size_t count;
    std::vector<int> data;

    // If the user does not enter a number "in >> count" will fail.
    if (in >> count)
    {
        int value;
        while (count-- && in >> value)
            data.push_back(value);
    }

    return data;
}


#include <iostream>

int main()
{
    auto data = load(std::cin);
    for (auto i : data)
        std::cout << i << std::endl;
}

您可以使用std::stringstream作为输入,在不读取文件的情况下对此进行测试。

#include <iostream>
#include <sstream>
int main()
{
    std::stringstream text("3\n5 2 4");
    auto data = load(text);

    for (auto i : data)
        std::cout << i << std::endl;
}

答案 1 :(得分:1)

在for循环中,您在位置1处启动数组而不是0.这会导致越界,因为您想要写入数组的元素2。如果分配一个包含2个元素的数组,则有效元素将为0和1.此代码有效:

int num;

scanf("%d", &num);

int array[num];

for (int i = 0; i < num; i++)
{
    scanf( "%d", &array[i] );
}

答案 2 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int num;
    scanf("%d", &num);

    int *array= malloc(sizeof(int) *num);    // num is known at runtime
    int i;
    for (i = 0; i < num; i++) {    //starts at 0, ends at num - 1 
        scanf("%d", &array[i]);
    }
    for (i = 0;i< num; i++) {
        printf("%d", array[i]);
    }
    free(array);
}

答案 3 :(得分:1)

array开始0,因为数组索引从0开始 - 如:

for (int i = 0; i < num; i++) 

你从1开始的第一个元素使它未定义。而且,你应该制作动态数组。

答案 4 :(得分:1)

[编辑:Answere特定于C ++,因为该问题也有C ++标签]

首先是第一件事。

你的数组定义是错误的。

int array[num];    // Super wrong way

在定义数组时,不应该将变量作为索引传递,不允许这样做。否则,它将导致“鼻恶魔”。

int * array = new int[num]    //correct way

代码现在可能正常工作,但您提供的数组定义属于UB类别。

答案 5 :(得分:1)

我喜欢Lidong Guo的代码,并将其修改为与Microsoft的C编译器一起运行。 唯一的变化是将所有数据定义移到任何可执行代码之前,而且我在打印数字之间添加了一个空格。

  #include <stdio.h>
  #include <stdlib.h>
  main()
  {
       int num;

       int *array; //[num];
       int i;

       scanf("%d\n", &num);//here deal with the newlinw
       array= malloc(sizeof(int) *num);//[num];

       for (i = 0; i < num; i++)
       {//the loop .start 0 end num -1
          scanf("%d", &array[i]);
       }

       for (i = 0; i < num; i++)
       {
          printf("%d ", array[i]);
       }

       free(array);
 }

答案 6 :(得分:0)

0开始循环,然后在num-1结束,即

for (int i = 0; i < num - 1; i++) 
    scanf("%d", &array[i]);   

粘贴输入不起作用的原因是它不包含两行之间的换行符

答案 7 :(得分:0)

更改

  

scanf

声明

  

scanf(“%d”,&amp; array [i]);

数组索引也从0开始,到num-1结束