C++中cin和cout中不会被注意的细节(字符串的处理)

本文详细介绍了C++中cin和cout的基本用法,包括字符输出、字符串读取及空行处理等问题。通过示例对比cin与getline的区别,帮助读者理解如何有效使用这些IO流操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cout.put(ch);

与cout << ch;类似。但是只可以输出单个字符。

cin

cin使用空白(空格,制表符和换行符)来确定字符串的结束位置。

例子:

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin >> ch;
        cout << "ch = " << ch << endl;
}

可以看出cin只能读取一个单词,那么如何让cin读取一行字符串呢?

这里引入两个类的成员函数:

getline(char* ch,int n);

读取一行输入,直到到达换行符。丢弃换行符。

get(char* ch,int n);

读取一行输入,直到到达换行符。将换行符保留在输入序列中。

ch是用来存储输入行的数组名称;n是要读取的字符数(读取n-1个字符,后面加‘\0’空字符)。

例子:

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.getline(ch,20);
        char sh[20];
        cin.getline(sh,20);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}


空行的问题

get()的问题

get()函数将换行符保留,那么下一个get()函数将读取空字符,而无法继续读取后面的字符了。

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.get(ch,20);
        char sh[20];
        cin.get(sh,20);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}

解决方法:

使用不带任何参数的cin.get()或者;可以读取下一个字符(即使是换行符)。

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.get(ch,20).get();
        char sh[20];
        cin.get(sh,20);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}


PS:有参数的get函数读到了空行(只有一个换行符)后,将设置失效位(failbit)。接下来的输入将被阻断(接收到的都是空的字符串)。要用下面命令进行恢复:

cin.clear();  //恢复输入
cin.get();    //吃掉换行符

getline()的问题

当输入的字符串比读取的个数长的时候,getline将设置失效位,并且关闭后面的输入。

#include <iostream>
using namespace std;
int main()
{
        char ch[20];
        cin.getline(ch,4);
        char sh[20];
        cin.getline(sh,4);
        cout << "ch = " << ch << endl;
        cout << "sh = " << sh << endl;
}

cin返回值

cin.get和cin>>返回一个cin对象,所以可以连写输入。

cin.getline(ch,20).get(sh,20);  //
cin >> ch >> sh; //小心空格
(cin >> ch).get(sh);

下面两个结果分别对应上面前两行代码:





<think>我们正在回答用户关于C++cin/cout与C语言的scanf/printf区别的问题。需要先给出清晰的解释,然后提出3-5个相关问题。 注意:回答必须用中文,最后以“§§相关问题§§”开头的问题列表,且不能换行分散。</think>在C++中,`cin`/`cout`与C语言的`scanf`/`printf`的主要区别如下: ### 核心区别 1. **语言基础** - `cin`/`cout`:C++的**面向对象流式I/O**(基于`<iostream>`库,使用`<<`/`>>`操作符重载) - `scanf`/`printf`:C语言的**过程化格式化I/O**(基于`<stdio.h>`库,依赖格式字符串如`%d`) 2. **类型安全** - `cin`/`cout`:**自动类型推导**(无需指定格式,编译器检查类型) ```cpp int num; cin >> num; // 自动识别int类型 cout << num; // 直接输出 ``` - `scanf`/`printf`:**手动类型指定**(格式错误导致未定义行为) ```c int num; scanf("%d", &num); // 必须写%d printf("%f", num); // 错误!%f匹配float但传入int ``` 3. **内存安全** - `cin`/`cout`:**自动管理缓冲区**(无需地址操作) - `scanf`:需显式取地址`&`(漏写`&`会导致内存越界) ```c scanf("%d", num); // 错误!缺少&导致崩溃 ``` 4. **扩展性** - `cin`/`cout`:支持**自定义类型重载**(可扩展`<<`/`>>`) ```cpp struct Point { int x,y; }; ostream& operator<<(ostream& os, Point p) { return os << "(" << p.x << "," << p.y << ")"; } // 直接使用:cout << Point{1,2}; ``` - `printf`:**仅支持内置类型**(无法扩展格式) 5. **性能差异** - `printf`:通常**更快**(直接系统调用,无类型检查开销) - `cout`:**可优化**(关闭同步:`ios::sync_with_stdio(false)`) ### 使用场景 | **特性** | `cin`/`cout` (C++) | `scanf`/`printf` (C) | |------------------|--------------------------|-----------------------| | 类型安全性 | ✅ 自动检测 | ❌ 依赖格式字符串 | | 代码简洁性 | ✅ 操作符链式调用 | ❌ 参数列表冗长 | | 自定义类型支持 | ✅ 可重载操作符 | ❌ 不可扩展 | | 高性能需求 | ⚠️ 需手动优化同步 | ✅ 默认高效 | | 跨语言兼容 | ❌ 仅C++ | ✅ 兼容C/C++ |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值