Можем ли мы использовать vector в c ++, чтобы принимать пользовательский ввод неизвестного размера только до тех пор, пока не нажмем ввод? - PullRequest
0 голосов
/ 18 апреля 2019

Я пытался получить пользовательский ввод в векторе в c ++, так как вектор - это динамическая структура данных, я хотел, чтобы он принимал ввод столько, сколько хочет пользователь, и когда пользователь нажимал клавишу ввода, он должен прекратить принимать ввод (так же, как строка, разница только в том, что я хочу сделать это в целочисленном векторе, но я не могу этого сделать, дайте мне знать, если это возможно или нет, принять пользовательский ввод в векторе, как я описал.

Я искал в Интернете различные способы, но мой код все еще работает не так, как я хочу, я попытался разорвать цикл ввода с помощью символов EOF, но он не останавливает цикл ввода. Я пытался использовать функцию cin.ignore(), но он также принимает пробел в счет я хочу остановить ввод только при нажатии клавиши ввода. ниже самый последний код, который я сделал:

#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> v;
char c;
for(int i=0;;i++){
    cin>>c;
    if(c=='\n'){
        break;
    }
    int x = c - '0';// typecasting char into integer.
    v.push_back(x);
}
cout<<v.size()<<endl;// just to check if it is done taking input and what is the size of vector now.
}

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Вы можете использовать std::getline(), чтобы получить всю строку, а затем std::istreamstream, чтобы получить целые числа в векторе:

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>

int main() {

    std::string input;

    std::getline( std::cin, input );

    std::istringstream is( input );

    std::vector<int> v( ( std::istream_iterator<int>( is ) ), std::istream_iterator<int>() );

    std::cout << v.size() << "\n";

    return 0;
}
0 голосов
/ 19 апреля 2019
  1. Когда вы читаете из std :: cin, он примет всю строку из консоли. Ваш cin >> c извлечет первый символ строки и поместит этот символ в переменную c.
  2. Это означает, что ваше if (c == '\ n') в значительной степени бессмысленно, так как строка будет занята, и вы не увидите явный '\ n' в качестве первого символа ... EVER.
  3. c - '0' преобразует один символ ASCII, который является цифрой (например, 0123456789), в число, которое вы можете использовать, но это НЕ является типизацией символа в целое число. Это преобразование символа ASCII, который оказывается числом, в числовое значение. Приведение типа - это когда вы меняете ТИП значения на другой ТИП.
  4. Я думаю вы хотите сделать что-то вроде следующего ...

    #include <iostream>
    #include <vector>
    #include <stdio.h>
    #include <conio.h>
    
    int main( int cArguments, const char** apszArguments ) {
        std::vector<char> vchars;
        char c;
    
        do {
          c = getche();
          vchars.push_back( c );
        } while( c != '\n' );
    
        std::cout << vchars.size() << " characters received" << std::endl;
        return 0;
    }
    

Обратите внимание, что в macOS и некоторых вариантах Linux getch / getche не определены, и вам нужно будет вместо этого использовать функции termios или ncurses.

0 голосов
/ 18 апреля 2019

Прочитайте всю строку как строку и постройте каждое число. Примерно так:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    string s; getline(cin, s);
    int num = 0;
    vector<int> v;
    for(int i = 0; i < s.size(); ++i)
        if(s[i] == ' ')
            v.push_back(num), num = 0;
        else
            num = num*10 + (s[i]-'0');
    v.push_back(num);

    cout << v.size() << endl;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...