字符串&内存函数

目录

一、字符串函数

1.strcpy

2.strncpy

3.strcat

4.strncat

5.strlen

6.strstr 

7.strcmp

8.strtok

二、内存操作函数

1.memcpy

2.memmove

3.memcmp

4.memset


一、字符串函数

1.strcpy

函数名: strcpy
功  能: 将src字符串拷贝至dest所指的地址
用  法: char *strcpy(char *dest, const char *src);
返回值: 返回参数dest的字符串起始地址

strcpy将src字符串结尾'\0'一同复制到dest中;
该函数未指定复制的字节数,当dest字符串太小无法完全存储src,可能会造成缓冲溢出的错误情况,不过可以使用strncpy()来取代;

程序例:

#include <stdio.h>
#include <string.h>

int main()
{
    char s1[20];
    char s2[] = "abcdef";
    strcpy(s1, s2);
    printf("%s\n", s1); // 输出:abcdef
    return 0;
}

2.strncpy

函数名: strncpy
功  能 : 将字符串src前n个字符拷贝到字符串dest
用  法 : char* strncpy(char* dest, const char* src, size_t n);
返回值: 返回参数dest的字符串起始地址


strncpy()不会向dest追加结束标记'\0';
src和dest所指的内存区域如果重叠,数据会重叠导致循环复制,dest必须有足够的空间放置n个字符;

程序例:

#include <stdio.h>
#include <string.h>

int main()
{
    char string[10] = "";//初始化为'\0'
    char* str1 = "abcdef";
    strncpy(string, str1, 3);
    printf("%s\n", string);//输出abc
    return 0;
}

3.strcat

函数名: strcat
功  能: 将src字符串接到dest字符串结尾处
用  法: char *strcat(char *dest, const char *src);
返回值: 返回dest字符串起始地址

strcat() 会将参数src字符串复制到参数dest所指的字符串尾部;
dest最后的结束字符'\0'会被覆盖掉,并在连接后的字符串的尾部再增加一个'\0';
dest与src所指的内存空间不能重叠,且dest要有足够的空间来容纳要复制的字符串;

程序例:

#include <stdio.h>
#include <string.h>

int main()
{
    char des[20] = "str";
    char src[] = "cat";
    strcat(des, src);
    printf("%s\n", des);  // 输出:strcat
    return 0;
}

4.strncat

函数名: strncat
功  能: 将src字符串前n个字符接到dest字符串结尾处
用  法: char *strncat(char *dest, const char *src, size_t n);
返回值: 返回dest字符串起始地址

strncat()将会从字符串src的开头拷贝n个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串;
如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部;
strncat()会将dest字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0';

程序例 :

#include <stdio.h>
#include <string.h>

int main()
{
    char des[20] = "str";
    char src[] = "cat";
    strcat(des, src, 2);
    printf("%s\n", des);  // 输出:strca
    return 0;
}

5.strlen

函数名: strlen
功  能: 计算指定的字符串s的长度,不包括结束字符'\0'
用  法: size_t strlen(const char *s);
返回值: 返回字符串s的字符数

strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束;
如果没有初始化字符串,将会得到一个随机值,因为查找处没有'\0',它会从首地址一直找下去,直到遇到'\0'停止;
而sizeof返回的是变量声明后所占的内存数,不是实际长度(只看内存大小),此外sizeof不是函数,仅仅是一个操作符,strlen()是函数;

程序例:

#include <stdio.h>
#include <string.h>

int main()
{
    char* str = "abcdef";
    int sl = strlen(str);
    printf("%d\n", sl);//输出6
    return 0;
}

6.strstr 

函数名: strstr 
功 能 : 检索子串在字符串中首次出现的位置 
用 法 : char* strstr(char* str, char* substr); 
返回值: 返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL 

substr若是数字,所搜索的将是该数字(作为ASCII码)代表的字符;
该函数是二进制安全的;
该函数对大小写敏感。如需进行大小写不敏感的搜索,请使用 stristr()。

程序例 :

#include <stdio.h>
#include <string.h>

int main()
{
    char des[20] = "stringstring";
    char src[20] = "gst";
    printf("%s\n", strstr(des, src, 2));//输出:gstring
    return 0;
}

7.strcmp

函数名: strcmp
功  能 : 字符串比较
用  法 : int strcmp(const char* s1, const char* s2);
返回值: 根据ASCII码比较,若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值

该函数区分大小写,如需进行大小写不敏感的字符串比较,可以使用stricmp函数

程序例 :

#include <stdio.h>
#include <string.h>

int main()
{
    char* a = "aBcDeF";
    char* b = "AbCdEf";
    char* c = "aacdef";
    char* d = "aBcDeF";
    printf("strcmp(a, b) : %d\n", strcmp(a, b));  // 输出:1
    printf("strcmp(a, c) : %d\n", strcmp(a, c));  // 输出:-1
    printf("strcmp(a, d) : %d\n", strcmp(a, d));  // 输出:0
    return 0;
}

8.strtok

函数名: strtok
功  能 : 根据分界字符组将字符串分割成一个个片段
用  法 : char* strtok(char* s, const char* delim);
返回值: 返回下一个分割后的字符串指针,如果已无从分割则返回NULL

当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为'\0'字符;
在第一次调用时,strtok()必须赋予参数s字符串,往后的调用则将参数s设置成NULL,所以将一个字符串完全分割往往需要多次调用该函数;
程序例 :

#include <stdio.h>
#include <string.h>

int main()
{
    char s[] = "ab_cde=fg";
    char* delim = "_=";
    char* p;
    for (strtok(s, delim); strtok(NULL, delim); )
    {
        ;
    }
    printf("%s %s %s", s, s+3, s+7);//输出:ab cde fg
}

二、内存操作函数

1.memcpy

函数名: memcpy
功  能 : 实现src到dest的复制
用法 :void* memcpy(void* dest, const void* src, size_t n)
返回值 : 返回指向dest的指针

如果目标区域与源区域重叠,该函数复制可能会将源区域的内容修改导致复制错误;
strcpy和memcpy主要有以下3方面的区别:
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
2、复制的方法不同。strcpy不需要指定长度。它遇到被复制字符的串结束符"0"才结束,所以容易溢出;
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

#include <stdio.h>
#include <string.h>

int main()
{
    const char src[20] = "memcpy";
    char dest[20];

    memcpy(dest, src, sizeof(src));
    printf("dest = %s\n", dest);//输出dest = memcpy

    return 0;
}

2.memmove

函数名: memmove
功  能 : 从str2复制n个字符到str1
用法 :void* memmove(void* dest, const void* src, size_t n)
返回值 :返回指向dest的指针

目标区域与源区域重叠memmove依旧可以正常复制。

#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "memmove hello";
    memmove(str + 6, str + 8, 5);
    puts(str);//输出memmovhellolo

    return 0;
}

3.memcmp

函数名: memcmp
功  能 : 把存储区 str1 和存储区 str2 的前 n 个字节进行比较
用法 :int memcmp(const void* str1, const void* str2, size_t n)
返回值 :如果返回值 < 0,则表示 str1 小于 str2;
               如果返回值 > 0,则表示 str1 大于 str2;
               如果返回值 = 0,则表示 str1 等于 str2。

#include <stdio.h>
#include <string.h>

int main()
{
    char str1[15] = "ABC";
    char str2[15] = "abc";
    int ret;

    ret = memcmp(str1, str2, 5);
    if (ret > 0)
    {
        printf("str2 小于 str1");
    }
    else if (ret < 0)
    {
        printf("str1 大于 str2");
    }
    else
    {
        printf("str1 等于 str2");
    }
    //str1 大于 str2

    return(0);
}

4.memset

函数名: memcmp
功  能 :  复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符
用法 :void* memset(void* str, int c, size_t n)
返回值 :如果返回值 < 0,则表示 str1 小于 str2;

n的值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。

int main()
{
    char str[20];

    strcpy(str, "hi boy");
    puts(str);//输出hi boy

    memset(str, '$', 2);
    puts(str);//$$ boy
    

    return(0);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值