• 《C++ Primer Plus》学习笔记——第5章 循环和文本输入


    1 概述

    C++中支持三种循环,for循环、while循环和do while循环。

    2 for循环

    for循环遍历字符串输出

    int main() {
        using namespace std;
        string str;
        cin >> str;
        for (int i = 0; i < str.size(); ++i) {
            cout << "str[" << i <<"] = " << str[i] << endl;
        }
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出

    234fds
    str[0] = 2
    str[1] = 3
    str[2] = 4
    str[3] = f
    str[4] = d
    str[5] = s
    Hello, World!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里的++i通常也有人写常i++,有前缀和后缀的区别。从语义上来说,二者都是对i进行自增。但是从效率上来说,可能存在差异。通常i++会将i复制一个副本,然后加一,然后再写回,而++i则是直接在i上面加一写回,效率要高一些。但是通常编译器优化时会将基本数据类型中的i++转换成++i。而对于类而言,用户自定义的自增函数,则++i类似的会更高效一些。

    2 while循环

    int main() {
        using namespace std;
        string str;
        cin >> str;
        int i = 0;
        while(i < str.size()) {
            cout << "str[" << i <<"] = " << str[i++] << endl;
        }
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出

    234fds
    str[0] = 2
    str[1] = 3
    str[2] = 4
    str[3] = f
    str[4] = d
    str[5] = s
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    只要while判断为true则执行循环体内容

    3 do while循环

    int main() {
        using namespace std;
        string str;
        cin >> str;
        int i = 0;
        do {
            cout << "str[" << i <<"] = " << str[i++] << endl;
        }while(i < str.size());243
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出

    234fds
    str[0] = 2
    str[1] = 3
    str[2] = 4
    str[3] = f
    str[4] = d
    str[5] = s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4 循环和文本输入

    4.1 空格等输入问题

    #include 
    
    int main() {
        using namespace std;
        char ch;
        int count = 0;
        cout << "enter characters; enter # to quit:\n";
        cin >> ch;
        while (ch != '#') {
            cout << ch;
            ++count;
            cin >> ch;
        }
        cout << endl << count << " characters read\n";
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出

    enter characters; enter # to quit:
    see ken run#really fast
    seekenrun
    9 characters read
    
    • 1
    • 2
    • 3
    • 4

    其中空格被忽略了,这是因为cin读取基本类型时会忽略空格和换行符,因为空格没有被回显,也没有被计入个数中。同时cin会有缓冲区的存在,当输入一系列字符后,并不会输入一个就发送给程序,而是放到了cin的缓冲区中,当输入enter时,缓冲区中的数据才被发送给程序。
    如果想保留空格,制表符,换行符的输入,可以使用cin中的get函数

    #include 
    
    int main() {
        using namespace std;
        char ch;
        int count = 0;
        cout << "enter characters; enter # to quit:\n";
        cin.get(ch);
        while (ch != '#') {
            cout << ch;
            ++count;
            cin.get(ch);
        }
        cout << endl << count << " characters read\n";
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出

    enter characters; enter # to quit:
    Did you use a #a pencil?
    Did you use a 
    14 characters read
    
    • 1
    • 2
    • 3
    • 4

    4.2 文件尾条件

    如果输入来自于文件,可以使用检测文件尾(EOF)的技术来判断是否到达了文件的末尾。
    常见的字符输入做法

    cin.get(ch);
    while (!cin.fail()) {
    	...
    	cin.get(ch);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可简化为

    while (cin.get(ch) {
    	...
    }
    
    • 1
    • 2
    • 3

    cin.get返回cin对象,istream中提供了一个将其对象转换成bool值的函数,这里会自动调用。

  • 相关阅读:
    python - unittest - ddt
    Flink watermark与乱序消息处理机制
    Day808.设计模式一些列问题 -Java 性能调优实战
    UML类图画法全程解析
    07-定位布局
    速看!湖北省首例落地专利开放许可有关内容解读
    学会Linux,看完这篇就行了!
    01-Java的static关键字、单例、代码块、继承
    【网页】腾讯云轻量应用服务器搭建网站
    多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接
  • 原文地址:https://blog.csdn.net/weixin_49274713/article/details/132788543