一、cin.get(ch) 是什么?

cin.get(ch) 是 C++ 中 cin 输入流的成员函数,核心作用是从输入中读取单个字符(包括空格、换行符等空白字符),并将读取的字符存入变量 ch 中。 它和直接用 cin >> ch 的最大区别是:cin >> ch 会自动跳过空格、换行、制表符等空白字符,而 cin.get(ch)读取所有字符(包括空白字符)。

二、cin.get(ch) 基础用法(完整代码)

#include <iostream>
using namespace std;

int main() {
    char ch;
    cout << "请输入任意字符(包括空格、换行):" << endl;
    
    // 循环读取字符,直到读取到换行符 '\n' 停止
    while (cin.get(ch)) {  // cin.get(ch) 成功读取返回true,失败(如EOF)返回false
        if (ch == '\n') {  // 遇到换行符,终止循环
            break;
        }
        cout << "你输入的字符是:" << ch << " ,ASCII码:" << (int)ch << endl;
    }
    
    return 0;
}

测试用例

输入:a b 123(输入后按回车) 输出:

你输入的字符是:a ,ASCII码:97
你输入的字符是:  ,ASCII码:32
你输入的字符是:b ,ASCII码:98
你输入的字符是:  ,ASCII码:32
你输入的字符是:1 ,ASCII码:49
你输入的字符是:2 ,ASCII码:50
你输入的字符是:3 ,ASCII码:51

三、cin.get(ch) vs cin >> ch 核心区别

特性 cin.get(ch) cin >> ch
读取空白字符 读取(空格、换行、制表符都读) 跳过(只读取非空白字符)
返回值 成功返回 cin 对象(可判断) 成功返回 cin 对象
适用场景 读取含空格的字符/逐字符处理 读取无空格的字符/数字

对比示例

#include <iostream>
using namespace std;

int main() {
    char ch1, ch2;
    
    cout << "测试 cin >> ch:" << endl;
    cin >> ch1;  // 输入 "  x",会跳过空格,读取 'x'
    cout << "cin >> ch 读取的字符:" << ch1 << endl;
    
    // 清空输入缓冲区(避免残留字符影响)
    cin.ignore();
    
    cout << "测试 cin.get(ch):" << endl;
    cin.get(ch2);  // 输入 "  y",会读取第一个空格
    cout << "cin.get(ch) 读取的字符:" << ch2 << " ,ASCII码:" << (int)ch2 << endl;
    
    return 0;
}

输入:

  x
  y

输出:

测试 cin >> ch:
cin >> ch 读取的字符:x
测试 cin.get(ch):
cin.get(ch) 读取的字符:  ,ASCII码:32

四、cin.get(ch) 的常见实用场景

场景1:读取含空格的整行字符(替代 cin >> string

#include <iostream>
using namespace std;

int main() {
    char str[100];
    char ch;
    int i = 0;
    
    cout << "输入含空格的字符串:" << endl;
    // 逐字符读取,直到换行或数组满
    while (cin.get(ch) && ch != '\n' && i < 99) {
        str[i++] = ch;
    }
    str[i] = '\0';  // 手动加结束符,构成合法C风格字符串
    
    cout << "你输入的字符串是:" << str << endl;
    return 0;
}

输入:hello world 123 → 输出:你输入的字符串是:hello world 123

场景2:处理之前你写的“大小写转换”(支持含空格输入)

#include <iostream>
using namespace std;

int main() {
    char ch;
    cout << "输入任意字符(支持空格):" << endl;
    
    while (cin.get(ch) && ch != '\n') {
        if (ch >= 'a' && ch <= 'z') {
            cout << (char)(ch - 32);  // 小写转大写
        } else if (ch >= 'A' && ch <= 'Z') {
            cout << (char)(ch + 32);  // 大写转小写
        } else {
            cout << ch;  // 其他字符(包括空格)直接输出
        }
    }
    
    return 0;
}

输入:ABC Def Gh123 → 输出:abc dEF gH123

五、注意事项

  1. 输入缓冲区:如果之前用 cin >> 读取过数据,输入缓冲区可能残留换行符,导致 cin.get(ch) 直接读取到换行符。此时需要用 cin.ignore() 清空缓冲区:
    cin.ignore();  // 忽略缓冲区中第一个字符(通常是换行)
    // 或清空所有残留:cin.ignore(numeric_limits<streamsize>::max(), '\n');
    
  2. 返回值判断cin.get(ch) 读取失败(如遇到文件结束符 EOF)时返回 false,可用于终止循环(如 while (cin.get(ch)))。
  3. 字符数组结束符:用 cin.get(ch) 拼接字符数组时,最后必须手动加 '\0',否则无法正常作为字符串使用。

总结

  1. cin.get(ch) 用于读取单个任意字符(包括空格、换行),是逐字符处理输入的核心函数;
  2. cin >> ch 的核心区别是是否读取空白字符,按需选择;
  3. 实用场景:处理含空格的输入、逐字符遍历字符串、精准控制输入读取。

0 条评论

目前还没有评论...

信息

ID
844
时间
1000ms
内存
256MiB
难度
10
标签
递交数
4
已通过
2
上传者