15. c99以前一直使用 gets 和 puts来输入输出字符串,但是gets因为无法获知内存大小,容易出现内存溢出(对此c99对gets,采取保留态势,c11直接废除,但是某些编译器仍然默认可以使用)。 gets会等待输入换行结束,但是gets返回的字符串却删除了换行符,对应的puts在末未添加了换行符。总之get put类函数,总是一行一行打印。fgets和fputs用来替代目前的函数,主要是定义了长度这个参数,还有第三个参数 stdio 和stdout(麻烦)。fgets 与gets不同,保留了用户输入的回车键,并在字符串末尾加上了‘/0’。fputs对应的不再加上换行符。特别的 fputs在目标内存满的时候,会返回空指针,这个特性使它应用起来要方便的多。对应的c11增加了 gets_s 和 s_gets两个函数,使字符串的情形更为复杂。gets_s:1.只能作为标准输入,不需要fgets第三个参数 2.丢弃换行符 3.内存溢出后,首先‘/0’替换首字符,丢弃以后的所有数据,直到出现换行符或者文件结尾,返回空指针。(what? 这些特性也造成了,该函数即便出错,用户也无法察觉) s_gets :1.用空字符替代换行符 2.读取一部分数据丢弃其他数据 3.不再返回 null指针。 有缺陷,如果输入丢失了换行,用户完全不知道发生了什么错误,还是不要看的好。(C11搞出了这两个东西?)scanf 你可理解为抓取一个个字符,put get对象是字符串。
16.对于字符串函数
1 char * strcpy(char * restrict s1 , const char * restrict s2);//将指针指向s2处的字符串 copy到s1指向的位置 2 char * strncpy(char * restrict s1 , const char * restrict s2,size_t n);//将指针指向s2处的字符串 copy到s1指 3 //向的位置 strncpy 多了一个 n 指的是有n个字符要拷贝,因为内存溢出的问题 4 char * strcat(char * restrict s1,const char * restrict s2);//字符串拼接 将s2拼接到s1,去掉空字符,返回s1地址 5 char * strncat(char * restrict s1,const char * restrict s2,size_t n);//字符串拼接 将s2拼接到s1,去掉空字符,返回s1地址,n个字符 6 int strcmp(const char * s1,const char * s2);//如果s1机器排序在s2后面,返回正数,如果s1排序在s2之前,返回负数,相等返回0 7 //机器排序?两个字符串首字符 a-z A-Z就是ascii 中实际位置的前后 8 int strncmp(const char * s1,const char * s2,size_t n);//如果s1机器排序在s2后面,返回正数,如果s1排序在s2之前,返回负数, 9 //相等返回0 比较n个字符后 停止 或者遇到空字符 10 char * strchr(const char * s ,int c);//返回首次出现 c字符的指针 未找到返回null 11 char * strpbrk(const char *s1 ,const char * s2);//如果s1包含s2任意字符,返回s1首地址,否则 null 12 char *strrchr(const char *s,int c);//c字符最后一次出现的位置,如果没有null 13 char *strstr(const char * s1,const char * s2);//s1 中s2出现的首位置,如果没有返回null 14 size_t strlen(const char *s);//不包括空字符的字符数 15