1

我正在用 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)

如果我输入输入它可以工作,但如果我粘贴它就不行。有什么线索吗?

4

8 回答 8

4

std::cin将换行符解释为空格,因此您正在使用的文件可能包含换行符以外的内容。您还使用非标准扩展来声明数组。这不是可移植的,也不保证所有编译器都支持。我建议你改用使用std::vector

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

下面的示例使用 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;
}
于 2013-08-04T21:24:06.513 回答
1

[编辑:答案特定于 C++,因为问题也有一个 C++ 标签]

嗯,第一件事。

你的数组定义是错误的。

int array[num];    // Super wrong way

在定义数组时,您不应该将变量作为索引传递,这是不允许的。否则会引发“鼻魔”。

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

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

于 2013-08-04T21:26:32.487 回答
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] );
}
于 2013-08-04T21:14:14.033 回答
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);
}
于 2013-08-04T21:18:35.973 回答
1

array0数组索引开始-0比如:

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

您从 1 开始第一个元素,这使得它未定义。此外,您应该制作动态数组。

于 2013-08-04T21:19:14.153 回答
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);
 }
于 2013-08-04T21:42:35.800 回答
0

开始你的循环0并结束它num-1,即

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

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

于 2013-08-04T21:08:16.470 回答
0

Change the

scanf

statement to

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

Also array indexing starts from 0 and ends at num-1

于 2013-08-04T21:10:49.437 回答