使用带有向量push_back的scanf和while循环

时间:2014-09-15 05:10:28

标签: c++ c vector buffer scanf

我试图从一行动态获取用户的整数,预期输入为:

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是为了防止追踪换行问题。

3 个答案:

答案 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中。也许你可以在发现奇怪的东西时调试你的代码。