C++ 输入输出 / 库函数 / STL 笔记总结

一、输入输出

1、特殊输入输出格式

输出输入控制符:

%x:以16进制读入输出整型变量
%nd:以n字符宽度输出整数,宽度不足时用空格填充
%0nd:以n字符宽度输出整数,宽度不足时用0填充

2、cin

cin >> m >> n 是一个表达式,如果成功读入所有变量,返回true,否则返回 false。

//读到没有字符时停止输入
int n, m;
while (cin >> n >> m) {
   
	printf("%d", n + m);
}

//读入每一个字符,不自动跳过空格
int c;  //返回值是ASCII码值
while ((c = cin.get()) != EOF) {
   
	cout<< (char)c;   //强转
}

//读入一行到字符数组
char line[10];
int length = sizeof(line);
//getline不会读入\n, 但是会在输入流中去掉它
//所以length >= 输入时该行的字符数时,不需要getchar()去吸收\n
cin.getline(line, length);  //最多读 length - 1 个,因为需要留一个位置给\0。

cin在读入char型数据时,会自动跳过空格,但是scanf就不会。

假如需要cin每个字符都读取,可以用cin. get()函数,但是该函数返回值不是char类型,而是ASCII码值,而且当没得字符读取时,会返回-1。

EOF就是 - 1,它本身不是什么输入截止的标志,只是get函数读不到会返回 - 1 而已。

3、scanf

scanf本身也只是一个函数,其返回值是成功读入的变量个数(为 int 类型),假如读不到就返回 - 1。

scanf 对字符数组读入字符串时,遇到空格或者换行符会停下,并且在末尾补上 ’ \0 ’ 。

char line[100];
scanf("%s", line);  //这里不需要取址符号,因为line本身就是一个指向数组起始地址的指针

char  str[1024];
scanf("%[^\n]", &str);  //遇到换行符停止输入(可将里面的\n替换成任意需要停下的字符)

4、gets

头文件:stdio.h(c),cstdio(c++)

//读入一行到字符数组
//会自动在末尾补\0,不会读入\n,但和cin.getline一样会把\n流掉
//可以无限读取,不会判断上限,以回车结束读取,所以应该确保s的空间足够大,不然容易溢出
char s[10];
while (gets(s)) {
     //读不到后会返回 0,读的到就返回正数
	printf("%s\n", s);
}

其他

  1. 在输入时,ctrl + z 表示输入结束。
  2. cin 和 scanf不要同时使用,cout 和 printf 也不要同时使用。

二、库函数 / 头文件

1、数学函数

# include<cmath>

int abs(int x); 
double fabs(double x);  //求浮点数绝对值
double cos(double x);
double sin(double x);
int ceil(double x);   //求不小于x的最小整数 (向上取整),例如ceil(3.14)== 4。
//向下取整可以:(int) x
double sqrt(double x);

2、字符串函数

1 ~ 5 :连接、找c第一次出现、找c最后一次出现、找substr第一次出现、字符串比较

6 ~ 10 :大小写无关字符串比较、复制、求长度、转小写、转大写

11 ~ 15 :连接前n个、比较前n个、复制前n个、抽出以 * 分割的字符字符串转整数

16 ~ 17 :字符串转浮点数、整数转 x 进制的字符串

#include<cstring>

 1. char *strcat(char *dest, const char  * src);
将字符串src连接到dest后面。执行后src不变,dest变长了。返回值是dest.

 2. char *strchr(const char *str, int c);
寻找字符C在字符串str中第一次出现的位置。
如果找到,就返回指向该位置的 char * 指针;
如果str中不包含字符c,则返回NULL.

 3. char *strrchr(const char *str, char c);
寻找字符c在字符串str中最后一次出现的位置。
如果找到,就返回指向该位置的char*指针;
如果str中不包含字符c,则返回NULL.

 4. char *strstr(const char *str, const char *subStr); 
寻找子串subStr在str中第一次出现的位置。
如果找到,就返回指向该位置的指针;
如果str中不包含字符串subStr,则返回NULL.

 5. int strcmp(const char *s1,const char *s2);
字符串比较。如果s1小于s2,则返回负数;
如果s1等于s2,则返回0;s1大于s2,则返回正数。 (注意是以ASCII码值比较,Z < a)

 6. int stricmp(const char *s1,const char *s2); 
大小写无关的字符串比较。
如果sl小于s2,则返回负数;如果sl等于s2,则返回0; s1大于s2,则返回正数。
不同的编译器实现此函数的方法有所不同,有的编译器是将s1、s2都转换成大写字母后再比较;
有的编译器是将s1、s2都转换成小写字母再比较。
这样,在s1或s2中包含ASCII 码介于‘Z'和‘a’之间的字符时
(即 ‘ [ ’、‘ \ ’、‘’ ]' ^ ’、‘  _ ’、‘ ` '6个字符)
不同编译器编译出来的程序,执行stricmp的结果就可能不同。

 7. char *strcpy(char *dest, const char *src);
将字符串src复制到dest。返回值是dest。

 8. int strlen(const char *s);
求字符串s的长度,不包括结尾的 ' \0 '.
(或者:int size(char *s);)

 9. char *strlwr(char *str);
将str中的字母都转换成小写。返回值就是str.

 10. char *strupr(char *str);
将str中的字母都转换成大写。返回值就是str。

 11. char *strncat(char * dest, const char *src, int n);
将src的前n个字符连接到dest尾部。如果src长度不足n.则连接src全部内容。返回值是 dest.

 12. int strncmp(const char *s1, const char *s2, int n);
比较s1前n个字符组成的子串和s2前n个字符组成的子串的大小。
若长度不足n,则取整个串作为子串。返回值和strcmp类似。

 13. char *strncpy(char *dest, const char *src, int n);
复制src的前n个字符到dest.如果src长度大于或等于n,
该函数不会自动往dest中写入‘ \0 '; 
若src长度不足n.则复制src的全部内容以及结尾的^\0’到dest,返回值是dest。

 14. char * strtok(char *str, const char *delim);
连续调用该函数若干次,可以做到:
从str中逐个抽取出被字符串delim 中的字符分隔开的若干个子串。
用法:
char str[] = "- This, a sample string, OK.";
char *p = strtok(str, " ,.-");  //str将被空格、逗号、句号、横杠分隔出子串
while (p != NULL) {
   
	cout<< p << endl;
	p = strtok(NULL, " ,.-");   //后续调用,第一个参数必须是NULL!!!
}

 15. int atoi(char  *s);
将字符串s中的内容转换成一个整型数返回。
例如,如果字符串s的内容是“1234”,那么函数返回值就是1234。
如果s格式不是一个整数,如是"a12" ,那么返回016. double atof(char *s);
将字符串s中的内容转换成实数返回。
例如,"12. 34"就会转换成12. 34。
如果S的格式不是一个实数,则返回017. char *itoa(int value, char *string, int radix);
将整型值 value 以 radix 进制表示法写入string。例如 :
char szValue[ 20];
itoa(27, szValue, 10);     //使得szValue的内容变为"27"
itoa(27, szValue, 16);     //使得szValue的内容变为"1b”

3、内存操作库函数

头文件: #include

(1)置值函数 :void * memset(void * dest, int ch, int n);
将从dest开始的n个字节,都设置成ch。返回值是dest。ch只有最低的字节才起作用

【常用方式】

memset(arr, 0, sizeof(arr));

【易错用法】
ch只有最低字节起作用,所以是拿ch的最低字节赋值给dest的每一个字节。又由于在下面的例子中,数组是int型,每一个数组元素占了4个字节,所以是arr[ i ] 的每一个字节都是 0x01,整合起来,arr [ i ] == 0x01010101 = 2 ^ 0 + 2 ^ 8 + 2 ^ 16 + 2 ^ 24 = 16843009。

int arr[10];
memset(arr, 1, sizeof(arr));  //本意是将数组所有元素变为1
for (int i = 0; i < 10; ++ i) 
	//最终会输出:16843009 1684
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值