如果第一个元素包含任何零,那么我的程序就会以不希望的方式运行
Posted
技术标签:
【中文标题】如果第一个元素包含任何零,那么我的程序就会以不希望的方式运行【英文标题】:If the first element contains any zero, than my program is behaving in an undesired way 【发布时间】:2020-01-08 06:03:39 【问题描述】:这有什么问题。如果第一个元素包含任何零,则除第一个元素外,一切正常。例如输入-> 100 输出-> 10 输入-> 6030 输出-> 630。
问题:
输入格式
第一行也是唯一一行由 n 个整数组成,用逗号分隔。
输出格式
解析后打印整数。
代码:
#include <sstream>
#include <vector>
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
vector<int> parseInts(string str)
// Complete this function
stringstream ss(str);
char ch;
vector<int> v;
int s;
int i = 0;
ss >> ch;
cout << ch;
while(ss >> i)
v.push_back(i);
ss >> ch;
return v;
int main()
string str;
cin >> str;
vector<int> integers = parseInts(str);
for(int i = 0; i < integers.size(); i++)
cout << integers[i] << "\n";
return 0;
【问题讨论】:
因为它最终会咬你:Why is “using namespace std;” considered bad practice? 和 Why should I not #include <bits/stdc++.h>? 应该在你的阅读清单上排在前面。 【参考方案1】:ss >> ch; cout << ch;
问题在于,您在进入循环并读取其余部分之前从输入流中提取 1 个字符。此外,您编写代码的方式是数字仅由一位数字组成,因为您只能将一位数字读入char
。
如果输入是一个逗号分隔的单行整数列表,最好使用std::getline()
读取整行并解析该行。您可以将分隔符指定为第三个参数,并使用std::stoi() 将读取的每个字符串转换为整数。这也将允许您读取包含多个数字的数字。
所以尝试改变 parseInts() 如下:
std::vector<int> parseInts(string str)
// Complete this function
std::stringstream ss(str);
std::vector<int> v;
std::string number;
while (getline(ss, number, ','))
v.push_back(std::stoi(number));
return v;
需要注意的一点是>>operator
与getline
的使用。前者将读取到空格或换行符,而后者将读取整行。如果不包含任何空格,您只能使用 >>
读取整行。
【讨论】:
你不应该使用std::stoi
而不使用第二个参数来检查整个字符串是否被解析【参考方案2】:
这有什么问题
您以错误的方式从字符串流中读取数据。
要了解为什么 6030 输入会得到 630 输出,请试运行您的代码。您正在从流中读取字符ch
,因此ch
被分配了值'6'
。现在,您再次使用变量 i
在 while 循环中从流中读取,但 i
是一个整数,因此 "030"
被转换为 30(int)
,您最终得到 630
作为输出。
请注意,对于 678、5、10 等情况,您将获得正确的输出,但并非适用于所有测试用例。
这是一种正确的做法:
#include <sstream>
#include <vector>
#include <iostream>
std::vector<int> parseInts(std::string str)
std::stringstream whole_str(str);
std::string integer_str;
int integer;
std::vector<int> v;
while(whole_str >> integer_str) // Read 1 integer(string) at a time
std::stringstream one_int(integer_str);
one_int >> integer; // Read and convert string to int
v.push_back(integer);
return v;
int main()
std::string str"100 200 5060 2040";
std::vector<int> integers = parseInts(str);
for(int i = 0; i < integers.size(); i++)
std::cout << integers[i] << "\n";
return 0;
输出
100
200
5060
2040
【讨论】:
string str( "100 200 5060 2040" )
并返回整数的向量。
我以为作者想要向量中的数字。谢谢你纠正我。我已经更新了我的答案。以上是关于如果第一个元素包含任何零,那么我的程序就会以不希望的方式运行的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 - 自定义 UIButton 半径删除约束?