C++ 如何读入用户输入的逗号分隔整数?
我正在编写一个程序,提示用户:C++ 如何读入用户输入的逗号分隔整数?,c++,cin,C++,Cin,我正在编写一个程序,提示用户: 数组大小 要放入数组的值 第一部分很好,我创建了一个动态分配的数组(必需),并将其设置为用户想要的大小 我被困在下一部分了。用户需要输入一系列以逗号分隔的整数,例如:1,2,3,4,5 如何接收这些int并将它们放入动态分配的数组中?我读到默认情况下cin接受由空格分隔的整数,我可以将其更改为逗号吗 请尽可能用最简单的方式解释,我是编程初学者(对不起!) 编辑:所有的答案就这么多了。问题是我们还没有涵盖向量…是否有一种方法只使用我拥有的动态分配数组 到目前为止,我
int *fill (int *&array, int *limit) {
cout << "What is the desired array size?: ";
while ( !(cin >> *limit) || *limit < 0 ) {
cout << " Invalid entry. Please enter a positive integer: ";
cin.clear();
cin.ignore (1000, 10);
}
int *newarr;
newarr = new int[*limit]
//I'm stuck here
}
int*填充(int*&数组,int*限制){
cout>*极限)| |*极限<0){
cout您可以使用下面的getline()
方法:
#include <vector>
#include <string>
#include <sstream>
int main()
{
std::string input_str;
std::vector<int> vect;
std::getline( std::cin, input_str );
std::stringstream ss(str);
int i;
while (ss >> i)
{
vect.push_back(i);
if (ss.peek() == ',')
ss.ignore();
}
}
#包括
#包括
#包括
int main()
{
std::字符串输入\u str;
std::vector-vect;
std::getline(std::cin,input_str);
std::stringstream ss(str);
int i;
while(ss>>i)
{
向量推回(i);
如果(ss.peek()==',')
忽略();
}
}
代码是从应答中提取和处理的。维克托的应答有效,但做的比需要的多。您可以直接调用cin上的ignore(),跳过输入流中的逗号
此代码所做的是读取输入数组大小的整数,在整数向量中为该数量的元素保留空间,然后循环到指定的元素数量,交替从标准输入读取整数并跳过分隔逗号(调用cin.ignore())。一旦读取了请求的元素数,它将打印出来并退出
#include <iostream>
#include <iterator>
#include <limits>
#include <vector>
using namespace std;
int main() {
vector<int> vals;
int i;
cin >> i;
vals.reserve(i);
for (size_t j = 0; j != vals.capacity(); ++j) {
cin >> i;
vals.push_back(i);
cin.ignore(numeric_limits<streamsize>::max(), ',');
}
copy(begin(vals), end(vals), ostream_iterator<int>(cout, ", "));
cout << endl;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
向量VAL;
int i;
cin>>i;
VAL.储备金(一);
对于(大小j=0;j!=vals.capacity();++j){
cin>>i;
VAL.推回(i);
忽略(数值限制::max(),',');
}
复制(开始(VAL)、结束(VAL)、ostream_迭代器(cout,“,”);
cout事先,您应该检查逗号是否存在,然后
如果不是,则声明错误。因此,我将处理
第一个数字分别为:
std::vector<int> dest;
int value;
std::cin >> value;
if ( std::cin ) {
dest.push_back( value );
char separator;
while ( std::cin >> separator >> value && separator == ',' ) {
dest.push_back( value );
}
}
if ( !std::cin.eof() ) {
std::cerr << "format error in input" << std::endl;
}
std::vector dest;
int值;
标准:cin>>值;
如果(标准::cin){
目的地推回(值);
煤焦分离器;
而(std::cin>>分隔符>>值和分隔符=','){
目的地推回(值);
}
}
如果(!std::cin.eof()){
std::cerr所有现有的答案都很好,但都是针对您的特定任务的。因此,我编写了一系列代码,允许以标准方式输入逗号分隔的值:
template<class T, char sep=','>
struct comma_sep { //type used for temporary input
T t; //where data is temporarily read to
operator const T&() const {return t;} //acts like an int in most cases
};
template<class T, char sep>
std::istream& operator>>(std::istream& in, comma_sep<T,sep>& t)
{
if (!(in >> t.t)) //if we failed to read the int
return in; //return failure state
if (in.peek()==sep) //if next character is a comma
in.ignore(); //extract it from the stream and we're done
else //if the next character is anything else
in.clear(); //clear the EOF state, read was successful
return in; //return
}
模板
用于临时输入的结构逗号_sep{//类型
T;//数据临时读取到的位置
运算符const T&()const{return T;}//在大多数情况下的作用类似于int
};
模板
std::istream&operator>>(std::istream&in,逗号_sep&t)
{
if(!(in>>t.t))//如果我们无法读取int
返回;//返回失败状态
if(in.peek()==sep)//如果下一个字符是逗号
in.ignore();//从流中提取它,我们就完成了
else//如果下一个字符是其他字符
in.clear();//清除EOF状态,读取成功
返回;//返回
}
示例用法:
typedef std::istream\u迭代器istrit;//流中的迭代器
std::vector vec{istrit(in),istrit()};//从两个迭代器构造向量
由于您是一名初学者,现在这段代码可能对您来说太多了,但为了完整起见,我想发布这段代码。使用C+11中的新std::stoi函数,代码可以简化一点。转换时它会处理输入中的空格,并且只有当特定令牌以非数字字符开头时才会引发异常。这段代码因此,我们将接受输入
“12de、32、34、45、45、23xp”
轻易拒绝
de12、32、34、45、45、23xp、
一个问题仍然存在,因为你可以看到,在第一种情况下,它将显示“12, 32, 34,45, 23”,在它已经截断“34 45”到34的末尾。可以添加特殊情况来处理这个错误,或者忽略令牌中间的空白。
wchar_t in;
std::wstring seq;
std::vector<int> input;
std::wcout << L"Enter values : ";
while (std::wcin >> std::noskipws >> in)
{
if (L'\n' == in || (L',' == in))
{
if (!seq.empty()){
try{
input.push_back(std::stoi(seq));
}catch (std::exception e){
std::wcout << L"Bad input" << std::endl;
}
seq.clear();
}
if (L'\n' == in) break;
else continue;
}
seq.push_back(in);
}
std::wcout << L"Values entered : ";
std::copy(begin(input), end(input), std::ostream_iterator<int, wchar_t>(std::wcout, L", "));
std::cout << std::endl;
wchar\t in;
std::wstring seq;
向量输入;
std::wcout>std::noskipws>>in)
{
如果(L'\n'==in | |(L','==in))
{
如果(!seq.empty()){
试一试{
输入。推回(标准::stoi(顺序));
}捕获(标准::异常e){
标准::wcout#包括
使用名称空间std;
int main(){
int x,i=0;
char y;//用于存储逗号
int-arr[50];
而(!cin.eof()){
cin>>x>>y;
arr[i]=x;
i++;
}
对于(int j=0;j#包括
使用名称空间std;
INTA[1000];
int main(){
字符串s;
cin>>s;
int i=0;
istringstream d(s);
b串;
while(getline(d,b,,')){
a[i]=stoi(b);
i++;
}
对于(int j=0;j您可以使用scanf而不是cin,并在数据类型符号旁边加逗号
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10],sum=0;
cout<<"enter five numbers";
for(int i=0;i<3;i++){
scanf("%d,",&a[i]);
sum=sum+a[i];
}
cout<<sum;
}
#包括
使用名称空间std;
int main()
{
int a[10],和=0;
cout首先,将输入作为字符串,然后解析字符串并将其存储在向量中,您将得到整数
vector<int> v;
string str;
cin >> str;
stringstream ss(str);
for(int i;ss>>i;){
v.push_back(i);
if(ss.peek() == ','){
ss.ignore();
}
}
for(auto &i:v){
cout << i << " ";
}
向量v;
字符串str;
cin>>str;
stringstream ss(str);
对于(int i;ss>>i;){
v、 推回(i);
如果(ss.peek()==','){
忽略();
}
}
用于(自动和i:v){
CUT是否有C++相关的<代码> SPLIT()/>代码:最简单的方式可能需要一些编码,你的开头句子表明你已经在使用这个方法了,看看你目前为止有什么帮助。
#include<bits/stdc++.h>
using namespace std;
int a[1000];
int main(){
string s;
cin>>s;
int i=0;
istringstream d(s);
string b;
while(getline(d,b,',')){
a[i]= stoi(b);
i++;
}
for(int j=0;j<i;j++){
cout<<a[j]<<" ";
}
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10],sum=0;
cout<<"enter five numbers";
for(int i=0;i<3;i++){
scanf("%d,",&a[i]);
sum=sum+a[i];
}
cout<<sum;
}
vector<int> v;
string str;
cin >> str;
stringstream ss(str);
for(int i;ss>>i;){
v.push_back(i);
if(ss.peek() == ','){
ss.ignore();
}
}
for(auto &i:v){
cout << i << " ";
}