吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 547|回复: 4
收起左侧

[求助] C++多字节操作cin.get

[复制链接]
tafeita 发表于 2023-6-30 00:27
本帖最后由 tafeita 于 2023-6-30 00:56 编辑

学习C++ Primer第5版674页的is.get(sink,size,delim),试着编了如下一小段代码:

[C++] 纯文本查看 复制代码
#include <iostream>

using namespace std;

int main()
{
        char arr[10];
        int a;
        for (int i = 0; i < 2; ++i) {
                a = cin.get(arr, 10).get();
                cout << a << endl;
                for (size_t i = 0; i < 10; ++i)
                        cout << arr[i];
                cout << "z" << endl;
        }
        return 0;
}


运行时输入abcdefghij然后敲回车键,结果如图片
第一轮循环的106是j的ascii码,第二轮循环的-1不知道对应的是什么输入?敲的回车换行ascii码应该是10,为何显示-1(在VS2015中编译)
不知哪位大佬肯指点指点
搜狗截图20230630002209.jpg

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yes2 发表于 2023-6-30 11:44
cin.get(arr, 10)读取了10个字符,但是实际上只传送9个给arr。再次调用get获取到j的数值,所以输出106。
由于只传送了9个字符给arr,所以你输出的是abcdefghi z
第二次循环的时候,cin.get(arr, 10)只读取到了\n,cin.get(arr, 10)实际上是转发到了cin.get(arr, 10, '\n')函数,所以遇到\n就停了,并且没有实际内容传输给arr,只是把arr的首字符置0。
接下来因为cin.get(arr, 10)已经读取到了文件末尾,所以get读取到的是eof,也就是-1。
再次输出arr的时候,因为你是按照数组遍历的方式,所以首字符0啥也没输出,后面的bcdefghi没有被修改,所以正常输出了。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
tafeita + 1 + 1 热心回复!

查看全部评分

nanaqilin 发表于 2023-6-30 13:51
用法:cin.get(arrayname,size)  把字符输入到arrayname中,长度不超过size,原因是c字符串结尾需要有一个\0
所以,你输入的size=10,最大可以接收9个字符,cin.get()的返回值是缓冲区的最后一个非\n字符,
所以第一行显示106,j的asci码
第二行显示adcdefghi

第二次循环时,继续读取缓冲内空,即读到了EOF,也就是-1
第一行显示-1
由于第二次循环,没有重新读入数据到err,err中仍为上次的数据
所以,第二行显示abcdefghi
 楼主| tafeita 发表于 2023-6-30 14:03
谢谢@yes2大佬的分析解读,您的指点提醒我在循环内增加了显示输入流条件状态的两行代码,修改如下:
[C++] 纯文本查看 复制代码
#include <iostream>

using namespace std;

int main()
{	
	char arr[10];
	int a;
	for (int i = 0; i < 2; ++i) {
		cin.get(arr, 10);  // 将 a = cin.get(arr, 10).get()拆开,分别查看get成员函数执行后cin的状态
		cout << "第" << i + 1 << "次循环cin.get(arr, 10)之后:" << endl;
		cout << "cin.eof--->" << boolalpha << cin.eof() << endl;
		cout << "cin.fail--->" << cin.fail() << endl;
		a = cin.get();
		cout << "第" << i + 1 << "次循环接着cin.get()之后:" << endl;
		cout << "cin.eof--->" << cin.eof() << endl;
		cout << "cin.fail--->" << cin.fail() << noboolalpha << endl;
		cout << a << endl;
		for (size_t i = 0; i < 10; ++i)
			cout << arr[i];
		cout << "z" << endl;
	}

	return 0;
}


运行结果说明第二次循环时,cin.get(arr, 10, '\n')读完\n之后,因为缓冲区里再无内容,输入流的failbit被置位(奇怪的是eofbit并没有被置位),由于failbit被置位才返回了-1。是不是badbit, failbit和eofbit任一个被置位,cin.get()就会返回-1?

再次感谢大佬的热心解答
搜狗截图20230630140255.jpg
 楼主| tafeita 发表于 2023-6-30 14:09
谢谢@nanaqilin的解答,好像不是因为eof,而是无数据可读fail造成的,不知道我的理解对不对
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表