我试图从一行动态获取用户的整数,预期输入为:
1 2 31 4 1
以上输入只是5个整数输入的示例,如果他/她想要,用户可以输入任意数量。
所以,我尝试使用vector来动态存储这些整数。这是我的代码:
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
vector<int> s;
int d, b;
while(scanf("\n%d", &d) == 1)
s.push_back(d);
printf("\nLength : %d", s.size());
return 0;
}
但是,它没有奏效。举一个例子,我输入6个数字然后按回车,我的期望是,它会显示向量的大小,但是它要求我提供另一个输入。我只能按Ctrl + D停止“输入询问”。
令我惊讶的是,这段代码效果很好:
#include <stdio.h>
int main()
{
int d;
while(scanf("\n%d", &d) == 1)
printf("%d ", d);
return 0;
}
所以我的问题是,printf和push_back之间是否有任何不同使我的第一个代码不起作用?
请注意,在scanf中\ n是为了防止追踪换行问题。
答案 0 :(得分:2)
问题是你的循环,你不能在条件中单独使用scanf
,因为你循环将继续并且scanf
等待输入,直到你明确地给出文件结束为止输入
如果您想继续使用C代码,我建议您查看fgets
,然后从字符串中提取值。
或者您可以使用C ++并使用std::getline
来读取std::string
,您可以将std::istringstream
放入{{3}}中,您可以轻松地从矢量中获取数字:
std::vector<int> s;
std::string line;
while (std::getline(std::cin, line) && !line.empty())
{
std::istringstream iss(line);
std::copy(std::istream_iterator<int>(iss),
std::istream_iterator<int>(),
std::back_inserter(s));
}
只要输入非空行,上面的代码就会循环,并使用输入中的数字填充向量s
。
答案 1 :(得分:1)
scanf
在到达行尾时不会失败。当它在寻找数字时,换行符只是空格,与空格字符或制表符或任何其他空白字符无法区分。如果您希望scanf
失败,则需要终止输入(通过您发现的Ctrl-D),或者输入无法解析为整数的内容。
如果您想要面向行的输入,请使用其他方法。既然你正在使用C ++,我建议std::getline
。
答案 2 :(得分:1)
首先,您能告诉我们您使用的是什么编译器,版本等。(不同的编译器可能有不同的行为)。
而且我不知道你的意思是“没用”?你的意思是“在你的控制台上打印一些东西”吗?
从您的代码中,您在这里使用while循环,它将不会退出,直到它读取EOF或遇到读取错误。在你的例子中,它不会命中 printf(“\ nLLthth:%d”,s.size());
int main() {
vector<int> s;
int d, b;
while(scanf("%d", &d) == 1) {
printf("\nLength : %d", s.size());
s.push_back(d);
}
return 0;
}
如果您在while子句中移动代码,您应该能够在控制台上看到输出。
一个。如果您知道整数,则可以使用具有固定计数的for循环;或者你可以尝试使用getline(cin,string)来读取整行。
B中。也许你可以在发现奇怪的东西时调试你的代码。