C语言中常见对字符串操作的函数

求字符串长度

----strlen()
----sizeof()

    char buf[] = "asadsa";
    printf("sizeof(buf)=%d\n",sizeof(buf));//7
    printf("strlen(buf)=%d\n",strlen(buf));//6

C语言的字符串数组在末尾默认加上’\0’
strlen()不算’\0’,只计算字符串的长度
sizeof()算上’\0’
另外sizeof()有一个要注意的,sizeof()用于数组,只能测出静态数组的大小,无法检测动态分配的数组大小,示例:

void transfer(char str[])
{
    int i = 0;
    for(i=0;i<sizeof(str)/sizeof(str[0]);i++)
    {
        if('a' <= str[i] && 'z' >= str[i])
            str[i] -= ('a' - 'A');
    }
}

像在这个函数里面,str是一个指向字符串的指针,求出来的长度只为4

|warning: 'sizeof' on array function parameter 'str' will return size of 'char *' [-Wsizeof-array-argument]|

编译器的warning,所以sizeof()不能求动态分配的数组的大小

对字符串进行拷贝设置

字符串设置
----memset()
常用来对字符串进行初始化,初始化为单一的值

    char str1[5] = "1234";
    printf("str1:%s\n",str1);
    memset(str1,'0',strlen(str1));//目标字符串,初始化值,长度
    printf("str1:%s\n",str1);

结果

str1:1234
str1:0000

字符串拷贝
----strcpy()
这个有时候面试也让写一下这个函数
这里贴出来

char * strcpy(char *dest, const char *src)
{
    if((dest == NULL) || (src == NULL))
    {
        return NULL;
    }
    char *ret = dest;
    while((*dest++ = *src++) != '\0');
    return ret;
}

strcpy()示例

    char str1[20] = "Hello World";
    char str2[20];
    memset(str2,'0',sizeof(str2)-1);
    printf("str2:%s\n",str2);
    strcpy(str2,str1);
    printf("str2:%s\n",str2);

输出结果:

str2:0000000000000000000
str2:Hello World

----memcpy()

    char str1[20] = "Hello World";
    char str2[20];
    char str3[20];
    memset(str2,'0',sizeof(str2)-1);
    printf("str2:%s\n",str2);
    
    strcpy(str2,str1);
    printf("str2:%s\n",str2);

    memcpy(str3,str1,strlen(str1));
    printf("str3:%s\n",str3);

输出结果:

str2:0000000000000000000
str2:Hello World
str3:Hello World

咋一看好像没什么区别
但是strcpy ()会拷贝结束符’\0’
memcpy()需要指定长度
strcpy()只用于字符串的复制,memcpy()对于要复制的内容没有限制
在使用strcpy()的时候如果不注意长度就会出现越界访问内存的问题,例子如下

char a;
char *str=&a;
strcpy(str,"hello");
printf(str);

将一个字符串复制进一个字符变量指针所指地址,虽然可以正确输出结果,但因为越界进行读写而导致程序崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值