C89:论常用的字符串函数

一.简介

 函数的定义不可以嵌套,但函数的调用可以嵌套

 

二.复制字符串

1.strcpy()

头文件:#include <string.h>和#include <stdio.h>

原型声明:char* strcpy(char* dest,const char* src);

 

strcpy是一种C语言的标准库函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*

1
2
3
4
5
6
7
8
//用法
char a[10],b[]="copy";
strcpy(a,b);    //将b中的copy到a中
 
char *pa=new char[10];
char *pb=b;
strcpy(pa,pb);
delete pa;

 

1
2
3
4
5
6
7
8
9
10
11
12
//C语言标准库函数strcpy的经典实现
 
#include <assert.h>    //C头文件
#include <cassert>     //C++头文件
char* strcpy(char* des,const char* src){
    char* r=des;
    assert((des!=NULL)&&(src!=NULL));
    while(*source++!='\0'){
        *r++=*source++;
    }
    return des;  //从函数中返回函数体内分配的内存是十分危险的,会导致内存泄漏
}

 

2.strcpy_s()

原型声明:errno_t strcpy_s(char* strDes,size_t num,const char* strSrc);

 

strcpy因为不安全会报警告,所以推荐使用strcpy_s

1
strcpy_s(pa,10,pb);

 

3.strncpy()

 

4.例子

char string[10];
char* str = "0123456789";
strcpy(string, str);

堆栈破坏,因为str多了结束字符'\0'

 

char string[10], str[10];
int i;
for(i = 0; i < 10; i++)
{
    str[i] = 'a';
}
strcpy(string, str);

没有结束字符

 

char string[10];
int a = strlen(str);
if (a <= 10)
{
    strcpy(string, str);
}

可能堆栈溢出,因为strlen不统计'\0'

 

复制代码
//错误
void
GetMemory(char* p) { p = (char*) malloc(100); } int main() { char* str = NULL; GetMemory(str); strcpy(str, "hello"); }

//正确

void getmemory(char **p)

{

*p=(char*)malloc(100);

//p = new char[100];

memset(*p,'\0',sizeof(*p[0])*100);

}


int main(int argc, char *argv[])

{

char * str = NULL;

getmemory(&str);

strcpy(str,"hello,world");

printf("%s",str);

return 0;

}


复制代码

动态分配内存在堆上,可用于函数外,但是指针未传出

 

复制代码
char* GetMemory(void)
{
    char p[] = "hello";
    return p;
}


int main()
{
    char* str = NULL;
    str = GetMemory();
    //strcpy(str, "hello");
    printf(str);
    //printf("k5");
    system("pause");
    return 0;
}
复制代码

打印乱码,没有字符串格式化

 

复制代码
void GetMemory(char** p, int num)
{
    *p = (char*) malloc(num);
}


int main()
{
    char* str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
    //printf("k5");
    system("pause");
    return 0;
}
复制代码

打印正确

 

void swap(int* p1,int* p2)
{
    int* p;
    *p = *p1;
    *p1 = *p2;
    *p2 = *p;
}

指针未初始化

 

三.格式化字符串

1.sprintf()

输出浮点数时,会按要求的或默认的精度进行四舍五入

 

2.printf()

 

四.剪切字符串

1.strcat()

 

五.比较字符串

1.strcmp()

 

六.统计字符串

1.strlen()

直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')

 

2.sizeof()

 包含结束字符的统计

posted @   言午丶  阅读(293)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示