C语言字符篇(二)字符串处理函数

字符串处理函数

1. 拷贝 strcpy
2. 追加 strcat
 
#include <string.h>  
char *strcpy(char *dest, const char *src); 将字符串src 复制到字符数组 dest
char *strncpy(char *dest, const char *src, size_t n); 将字符串src开始的 n个字节复制到字符数组dest

char *strcat(char *dest, const char *src);

将字符串src接在字符串数组dest的后面
char *strncat(char *dest, const char *src, size_t n); 将字符串src开始的n个字符接在字符串数组的dest后面
 
字符串拷贝有三要素:
1.从哪里拷贝
2.拷贝到哪里去
3.拷贝多少空间?

 

    strcpy是不安全的,因为它是以'\0'作为拷贝的结束符,并没有规定拷贝的大小,因此会造成内存泄漏.
    所以后来在 strcpy 的基础上,追加了strncpy
    strcpy是将一个字符串拷贝给另一个空间
    strncpy 是在此基础上规定拷贝字符串的大小.如果没有规定大小,将一个无线大的字符串拷贝给内存,将造成重要资料崩溃.

 

解读:

char *strncpy(char *dest, const char *src, size_t n);
首先看参数:
拷贝到那里去: char *dest 说明这是一个允许修改的字符串指针.也确实是这样.
从哪里拷贝: const char *src 这是一个不允许修改的字符串指针,这样设计是合理的,我们不希望将一个字符串拷贝给另一个字符串后,原来的字符串给没了.所以const保护是正确的
拷贝多少: size_t n xxx_t 是 typedef的标志,反正就是长度的意思,这个参数规定了要拷贝字符串的大小.

然后看返回值:

The strcat() and strncat() functions return a pointer to the resulting string dest.
char *返回的是dest的指针.
 
 
char *strncpy(char *dest, const char *src, size_t n);
-------------------------------------------------------
            int main(int argc, char **argv) {

                const char *src="hello strncpy";

                char dest[100];

                strncpy(dest,src,strlen(src));    //将src里面的字符串拷贝到dest,strlen将记录不包括'\0'的字符串实际长度,因此在结尾手动补零
                dest[strlen(src)]=0;    //在字符串后面补0
                printf("i am src: %s\n",src);  //hello strncpy
                printf("i am dest: %s\n",dest);  //hello strncpy
            }

-------------------------------------------------------

 

 

 char *strncat(char *dest, const char *src, size_t n);

-------------------------------------------------------
            int main(int argc, char **argv) {
                const char *str1="strcat";

                char buf[100]={"hello,"};

                strncat(buf,str1,strlen(str1));

                printf("%s\n",buf);    //hello,strcast

            }
-------------------------------------------------------

 

posted @ 2018-12-09 12:08  kmist  阅读(411)  评论(0编辑  收藏  举报