我正在用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
)
如果我输入输入,它会起作用,但如果我粘贴输入则不行。任何线索?
答案 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结束