您的位置:首页 > 编程语言 > C语言/C++

C++零碎:输入输出+Sleep挂起+utf-8字节数判断+静态成员变量+字符串结束符+链表+文件输入输出+改栈空间

2017-12-10 23:31 543 查看
1.输入输出

关于流:

参考自http://blog.csdn.net/u014360239/article/details/38018753

(stdin)就是标准输入的意思。就是以终端(计算机)为对象;即从键盘输入数据,运行结果到显示器屏幕上(就叫标准输入输出);再来解释下流的概念(流这个概念也解释不通,各种说法都有,反正我就暂理解为数据传输的字节序列吧)实际上,在内存中为每个数据流开辟一个内存缓冲区,用来存放流中的数据。当你向显示器输出数据时比如用(cout<<),现将这些数据送到程序中的输出缓冲区保存,直到缓冲区满了或遇到endl,就将缓冲区的全部数据送到显示器显示出来。在输入时,从键盘输入的数据先放在键盘缓冲区中,当按回车键时,键盘缓冲区中的数据输入到程序的输入缓冲区里。形成cin流。然后用提取预算符提取数据送给程序的有关变量。总之流是与内存缓冲区相对应的,或者说,缓冲区中的数据就是流。

缓冲区的类型有三个:全缓冲,行缓冲和不带缓冲:

1)全缓冲

在这种情况下,当填满标准I/O缓存后才进行实际I/O操作,全缓冲的典型代表是对磁盘文件的读写。

2)行缓冲

在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键时才进行实际的I/O操作。典型代表就是我在讲的(stdin)和标准输出(sdout)/

3)不带缓冲

也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

stdin:stdin是C语言中标准输入流,一般用于获取键盘输入到缓冲区里的东西。

访问stdin,可用stdio.h中提供的以下几个函数从stdin流中获取指定的数据:

scanf:根据第一个参数指定的格式符将数据读入后续参数指定的内存位置中

getchar:从stdin流中读取一个字符并返回

cin,cout:

cin.sync_with_stdio(false);

cout.sync_with_stdio(false);

cin,cout较scanf,printf慢是有原因的。默认时,cin与stdin,cout和stdout总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱。

只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。

但是这时,由于输出不同步cin,cout和scanf,printf就不能混用了。
2.Sleep挂起

#include<Windows.h>

Sleep(n); //n毫秒

执行挂起一段时间,也就是等待一段时间在继续执行
3.utf-8编码字节数判断和汉字数判断

占1个字节的:数字,英文字母占1个字节

占2个字节的:汉字

占3个字节的:基本等同于GBK,含21000多个汉字

占4个字节的:中日韩超大字符集里面的汉字,有5万多个

UTF-8最大的一个特点,就是它是一种变长的编码方式。它能够使用1~6个字节表示一个符号,依据不同的符号而变化字节长度。

UTF-8的编码规则非常easy,仅仅有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是同样的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,所有为这个符号的unicode码。

如表:

1字节 0xxxxxxx

2字节 110xxxxx 10xxxxxx

3字节 1110xxxx 10xxxxxx 10xxxxxx

4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

一个判断并获取每个utf-8字符的C++代码:

char str[8192];//句子
while (in.getline(str, 8192)) {
//统计句子中字和字所在char索引
int str_len = strlen(str);
int i = 0, word_one_len = 0;//句子中汉字总数目
string word_one;//一个字
while (i < str_len) {//注:if else 的&运算判断顺序不能改变!!!
word_one = "";
if (!(str[i] & 0x80)) {//数字字母
word_one.append(1, str[i]);
i++;
}
else if (!(str[i] & 0x20)) {//占两个字节的汉字字符
word_one.append(1, str[i]);
word_one.append(1, str[i + 1]);
i += 2;
}
else if (!(str[i] & 0x10)) {//占三个字节的汉字字符
word_one.append(1, str[i]);
word_one.append(1, str[i + 1]);
word_one.append(1, str[i + 2]);
i += 3;
}
else if (!(str[i] & 0x08)) {//占四个字节的汉字字符
word_one.append(1, str[i]);
word_one.append(1, str[i + 1]);
word_one.append(1, str[i + 2]);
word_one.append(1, str[i + 3]);
i += 4;
}
word_one_len++;//句子字数加一
word_i[word_one_len] = i;//i值之前表示这个字
}

4.静态成员变量

在类中创建静态成员变量(可以不以创建类对象而存在)。可直接有ClassName().调用。

static 类型 变量名;

静态成员变量不能在类中初始化;

静态整型常量才能在类中初始化;
5.字符串结束符

char数组类型的字符串一定以'\0'结束符,不然多输出奇怪的字符。

std::string:标准中未规定需要\0作为字符串结尾。编译器在实现时既可以在结尾加\0,也可以不加。但是,当通过c_str()或data()(二者在 C++11 及以后是等价的)来把std::string转换为const char *时,会发现最后一个字符是\0。
6.链表

链表赋值时应该使用地址,指针赋值。
7.文件输入输出
#include<iostream>
ifstream in;
in.open("filename");
if(!in.is_open()){
cout<<"error"<<endl;
}
in.clear();
in.close();
ofstream out;
out.open("filename");
if(!out.is_open()){
cout<<"error"<<endl;
}
out.clear();
out.close();

8.更改堆栈空间解决栈溢出

程序静态数据量大的时候,有时会出现栈溢出问题,往往是程序还没运行算法,就down掉了。Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow。

在 Visual Studio 开发环境中更改堆栈空间

调试——ProjectName属性——链接器——系统

· 堆栈提交大小Stack Reserve Size 100000000;

· 堆栈保留大小Stack Commit Size  100000000.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐