• (ACM模式时)C++的输入输出需要注意的点


    1.解决cin输入string时遇到空格会停止识别

    cin 遇空格停止识别,虽然输入很长一串字符,但是cin在第一个遇到第一个空格就停止输入,如果你打算输入的字符串中带1个或多个空格,则采用getline把停止识别的符号设置为‘\n’(即换行符),就能正确输入输出了。

    std::string myWords;
    
    std::getline(std::cin, myWords, '\n');
    
    std::cout << myWords << std::endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    只要输入第一个字符不是回车,最后一个字符是回车,这之间的内容都会被读取到line中,这些内容就可以是包含空格的字符串了。

    2. 将输入的字符串拆分为单词

    C++ 拆分字符串为单词的五种方法,其中最方便的一种如下
    istringstream 作用是从string对象中读取字符。遇到空格时停滞,下一次输出从空格后开始。注意, istringstream 这个类包含在库 < sstream > 中,所以头文件必须包含这个库。

    #include 
    #include 
    #include 
    #include   // istringstream
    using namespace std;
    
    int main()
    {
        string str { "dog cat cat dog" };
        istringstream input( str );
        vector<string> vec;
    	
        // ---------------------------------------------
        string temp;
        while ( input >> temp )
            vec.push_back( temp );
        // ---------------------------------------------
        
        for ( string word : vec )
            cout << word << " ";
        cout << endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    还有一个C++分割带逗号的字符串的例子(逗号替换为空格,然后用上面的方法解决)

    #include 
    #include 
    #include 
    using namespace std;
    int main(){
    	string s = "ab,cd,e,fg,h";
    	int n = s.size();
    	for (int i = 0; i < n; ++i){
    		if (s[i] == ','){
    			s[i] = ' ';
    		}
    	}
    	istringstream out(s);
    	string str;
    	while (out >> str){
    		cout << str <<' ';
    	}
    	cout << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    示例:输入"11:00:00 03:00:00 02:00:00",求分别输出02:00:00、03:00:00、11:00:00

    #include
    #include
    #include
    #include
    #include
    using namespace std;
    
    //把时间如02:00:00转成秒输出的函数
    int calcul(string s) {         
    int hh=stoi(s.substr(0,2));         
    int mm=stoi(s.substr(3,5));         
    int ss=stoi(s.substr(6,s.length()));         
    return hh*60*60+mm*60+ss;  }
    
    
    01:00:00 17:00:00 09:00:00 
    //11:00:00 03:00:00 02:00:00    
    int main(){
    	string s; 
    	getline(cin, s, '\n');
    	//cin>>s; //要注意cin输入string时遇到空格会停止识别
    	
    	//istringstream 作用是从string对象中读取字符。
    	istringstream input(s);
    	vector<string> vec;
        string temp;
        while (input >> temp){
            vec.push_back(temp);
    	}
    
    	sort(vec.begin(),vec.end());
    	cout<<vec.size()<<endl;
    	for(int i=0;i<vec.size();i++){
    		cout<<vec[i]<<endl;
    	}
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    3.ACM模式下的链表输入和输出

    //定义一个链表类
    class ListNode {
    public:
    	int val;   //节点值
    	ListNode* next;    //下一个节点
    	ListNode(int n) :val(n), next(nullptr) {}  //构造函数
    	ListNode(int n, ListNode* next) :val(n), next(next) {} 
    };
    //构造链表,先假设所有节点的值按顺序存放于一个vector容器里,并且节点值顺序即链表节点顺序
    ListNode* getListNodemy(vector<int> &str) {
    	ListNode* dumyHead = new ListNode(-1);
    	ListNode* ptr = dumyHead;
    	int nums = str.size();
    	int i = 0;
    	while (i<nums) {
    		dumyHead->next =new ListNode(str[i]);
    		dumyHead = dumyHead->next;
    		i++;
    	}
    	return ptr->next;
    }
    
    //按顺序输入节点值,为了实现一次输入所有节点值,这里采用输入字符串的形式来获取节点值
    vector<int> getVector(string input) {
    	vector<int> ans;
    	stringstream ss;
    	ss.str(input);
    	string item;
    	char delim = ',';
    	while (getline(ss, item, delim)) {
    		ans.push_back(stoi(item));
    	}
    	cout << "节点输入完成" << endl;
    	return ans;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    代码随想录算法训练营第六天 | 哈希表算法题
    Java:面向对象编程及继承
    枚举类根据name获取value
    ICLR 2022 | Facebook AI提出解决表示学习坍塌问题新方法
    TPU编程竞赛|算丰助力2023 CCF大数据与计算智能大赛!
    ubuntu18.04安装显卡驱动,cuda,cudnn
    阿里云云数据库Redis的核心概念以及正确购买姿势(十五)
    浅谈哈希表
    第一章 - 第4节-计算机软件系统 - 课后习题
    备份程序 bacula和bacula-api 安装
  • 原文地址:https://blog.csdn.net/goodgoodstudy___/article/details/126403408