学习笔记之字符串学习

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

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 的两个参数srcdest 所指的内存区间如果重叠则无法保证正确拷贝,而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标准输出是行缓冲。

学习笔记之字符串学习_第1张图片
上图是C标准库的I/O缓冲区

你可能感兴趣的:(学习笔记之字符串学习)