如果第一个元素包含任何零,那么我的程序就会以不希望的方式运行

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;

需要注意的一点是&gt;&gt;operatorgetline 的使用。前者将读取到空格或换行符,而后者将读取整行。如果不包含任何空格,您只能使用 &gt;&gt; 读取整行。

【讨论】:

你不应该使用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" ) 并返回整数的向量 我以为作者想要向量中的数字。谢谢你纠正我。我已经更新了我的答案。

以上是关于如果第一个元素包含任何零,那么我的程序就会以不希望的方式运行的主要内容,如果未能解决你的问题,请参考以下文章

Python 程序以不同于英语的语言显示消息

Swift 3 - 自定义 UIButton 半径删除约束?

使用 onBackPressed 仅从第一个片段退出 App

77-绝对定位-参考点

如何排除具有零值的元素-XSLT?

方案循环不会遍历列表中的所有元素