学习笔记之字符串学习

字符串学习中主要加深了对以前掌握中的盲点学习。

1,memcpy和memmove函数的区别

函数的原型如下:

memcpy 函数从src 所指的内存地址拷贝n 个字节到dest 所指的内存地址,和strncpy 不同,memcpy 并不是遇到'/0' 就结束,而是一定会拷贝完n 个字节。这里的命名规律是,以str 开头的函数处理以'/0' 结尾的字符串,而以mem 开头的函数则不关心'/0' 字符,或者说这些函数并不把参数当字符串看待,因此参数的指针类型是void * 而非char *

memmove 也是从src 所指的内存地址拷贝n 个字节到dest 所指的内存地址,虽然叫move但其实也是拷贝而非移动。但是和memcpy 有一点不同,memcpy 的两个参数srcdest 所指的内存区间如果重叠则无法保证正确拷贝,而memmove 却可以正确拷贝。假设定义了一个数组char buf[20] = "hello world/n"; ,如果想把其中的字符串往后移动一个字节(变成"hhello world/n" ),调用memcpy(buf + 1, buf, 13) 是无法保证正确拷贝的。

2,C标准库的I/O缓冲区。

     C标准库的I/O缓冲区有三种类型:全缓冲、行缓冲和无缓冲。当用户程序调用库函数做写操作时,不同类型的缓冲区具有不同的特性。

     全缓冲 如果缓冲区写满了就写回内核。常规文件通常是全缓冲的。行缓冲 如果用户程序写的数据中有换行符就把这一行写回内核,或者如果缓冲区写满了就写回内核。标准输入和标准输出对应终端设备时通常是行缓冲的。     无缓冲 用户程序每次调库函数做写操作都要通过系统调用写回内核。标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。观察下面的实例:
当直接运行时,发现终端并没有输出“Hello ,world”,将注释去掉或将将printf("Hello,world")替换成printf("Hello, world/n")都能打印出“Hello ,world”。从上面的例子证明,C标准输出是行缓冲。

上图是C标准库的I/O缓冲区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值