您的位置:首页 > 其它

学习笔记之字符串学习

2011-06-21 20:49 190 查看
字符串学习中主要加深了对以前掌握中的盲点学习。

1,memcpy和memmove函数的区别

函数的原型如下:

#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
返回值:dest指向哪,返回的指针就指向哪


memcpy
函数从
src
所指的内存地址拷贝
n
个字节到
dest
所指的内存地址,和
strncpy
不同,
memcpy

并不是遇到
'/0'
就结束,而是一定会拷贝完
n
个字节。这里的命名规律是,以
str
开头的函数处理以
'/0'
结尾的字符串,而以
mem
开头的函数则不关心
'/0'

字符,或者说这些函数并不把参数当字符串看待,因此参数的指针类型是
void *
而非
char *


memmove
也是从
src
所指的内存地址拷贝
n
个字节到
dest
所指的内存地址,虽然叫move但其实也是拷贝而非移动。但是和
memcpy
有一点不同,
memcpy

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

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

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

全缓冲 如果缓冲区写满了就写回内核。常规文件通常是全缓冲的。行缓冲 如果用户程序写的数据中有换行符就把这一行写回内核,或者如果缓冲区写满了就写回内核。标准输入和标准输出对应终端设备时通常是行缓冲的。 无缓冲 用户程序每次调库函数做写操作都要通过系统调用写回内核。标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。观察下面的实例:
#include<stdio.h>
int main()
{
printf("Hello ,world/n");
/*fflush(stdout);*/
while(1);
return 0;
}


当直接运行时,发现终端并没有输出“Hello ,world”,将注释去掉或将将printf("Hello,world")替换成printf("Hello, world/n")都能打印出“Hello ,world”。从上面的例子证明,C标准输出是行缓冲。


上图是C标准库的I/O缓冲区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: