注册 登录
编程论坛 C语言论坛

有关缓冲区的事情

Knightl8 发布于 2020-03-24 13:49, 1994 次点击
不是很明白有关输入输出缓冲区的原理,麻烦大佬讲讲
8 回复
#2
maomao123452020-03-24 13:59
https://
去看看吧
#3
lin51616782020-03-24 14:00
stdin/stdout 由进程创建并分配内存作为缓冲区
缓冲区指针保存在stdin/stdout的某个数据成员里面

调用scanf/getchar等函数
如果缓冲区是空的 进程会暂停 等待输入
输入数据会写入stdin缓冲区
然后 scanf/getchar等函数会从缓冲区获取这些输入数据

调用printf/putchar 等函数
会把数据写入stdout缓冲区
等到触发特定条件 就把缓冲区里面的数据全部输出

备注 特定条件详细情况 请搜索 无缓冲/行缓冲/满缓冲
#4
叶纤2020-03-24 14:17
回复 3楼 lin5161678
大大想问你个问题?
1,stdout会不会接受null呢?也就是' /0'
2如果接收那在缓冲区是一个什么形态的地址
当然不回答也是可以的
#5
lin51616782020-03-24 14:24
以下是引用叶纤在2020-3-24 14:17:26的发言:

大大想问你个问题?
1,stdout会不会接受null呢?也就是' /0'
2如果接收那在缓冲区是一个什么形态的地址
当然不回答也是可以的

槽点较多 null 不是 '\0'
缓冲区写入不做限制 能写入 '\0'
缓冲区接受不是地址 更谈不上形态
缓冲区保存的是数据 要输出 123
stdout 保存的数据就是'1' '2' '3'
写入'\0'
缓冲区保存的数据就是 '\0'
#6
叶纤2020-03-24 14:41
有点晕/和\这个号,下次我会注意的
谢谢啦
#7
Knightl82020-03-24 15:01
回复 3楼 lin5161678
程序代码:
#include <iostream>
using namespace std;
int main() {
    string password, temp;
    int n, cnt = 0;
    cin >> password >> n;
    getchar();   //老哥,请问为啥要用getchar()呢
    while(1) {
        getline(cin, temp);
        if (temp == "#") break;
        cnt++;
        if (cnt <= n && temp == password) {
            cout << "Welcome in";
            break;
        } else if (cnt <= n && temp != password) {
            cout << "Wrong password: " << temp << endl;
            if (cnt == n) {
                cout << "Account locked";
                break;
            }
        }
    }
    return 0;
}

#8
lin51616782020-03-24 15:08
回复 7楼 Knightl8
根本不应该用getchar
应该用 cin.ignore();
#9
叶纤2020-03-24 15:18
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
1