字符串操作常用函数

1.puts函数(字符串输出函数)

一般形式:puts(字符数组)

作用:输出一个字符串

2.gets函数(字符串输入函数)

一般形式:gets(字符数组)

作用:从终端输入一个字符串到字符数组函数。

非法内存问题

#include <stdio.h>

int main()
{
    char *pstr; //野指针  乱指
    //char *pstr = NULL;//什么都不指
                        //二者均会报错
    printf("请输入字符:\n");
    
    gets(pstr);   //字符串输入     或者用scanf
    //scanf("%s",pstr);
    
    puts(pstr);   //字符串输出

    return 0;
}

以上代码会报错
因为造成非法内存访问(不论使其为野指针还是使其等于NULL)

如何解决以上问题:
1.定义成数组的形式:

char pstr[128] = {'\0'};

2.开辟空间:

char *pstr;
pstr = (char*)malloc(128);

3.字符串初始化函数 memset

char pstr[128] = {’\0’};
1.申请空间
2.初始化
把每一个元素都初始化成\0

   char *pstr;
   pstr = (char*)malloc(128);
   
if(pstr == NULL){
   printf("内存申请失败\n");
   exit(-1);
}

  memset(pstr,'\0',128);  //初始化的对象  初始化的字符   多大

注意:
malloc 1.要防止内存泄漏的问题
2.申请内存可能会失败,要对返回值作判断


4.拷贝函数之strcpy

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

功能:
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间

说明:
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回指向dest的指针。


5.strncpy

语法
char *strncpy(char *destinin, char *source, int maxlen);

参数
destinin:表示复制的目标字符数组;
source:表示复制的源字符数组;
maxlen:表示复制的字符串长度。


        char *dest;
        dest = (char*)malloc(128);
        memset(dest,'\0',strlen(dest));

        char *src = "do not know";

        strcpy(dest,src);

        puts(dest);

        memset(dest,'\0',strlen(dest));
        strncpy(dest,src,3);
        puts(dest);


6.strcat

原型
extern char *strcat(char *dest, const char *src);

功能
把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除dest原来末尾的“\0”)。要保证dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。

说明
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。


7.strcmp

strcmp函数是string
compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数

规则
当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。


        char *dest2;
        dest2 = (char*)malloc(128);
        strcpy(dest2,"yes,I do.");
        //  或者定义成数组      char dest2[128] = "yes,I do ";

        strcat(dest2,src);
        puts(dest2);

        char *str1 = "1234";
        char *str2 = "123";

        int ret = strcmp(str1,str2);

        printf("ret = %d\n",ret);

8.strchr

函数原型
char *strchr(const char *str, int c)

参数
str-- 要被检索的 C 字符串。
c-- 在 str 中要搜索的字符。

功能
在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。

返回值
返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针


9.strstr

功能:
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。

如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。


        char *str = "are you here";
        char *r = strchr(str,'e');

        if(r == NULL){
                printf("do not find\n");
        }else{
                printf("find\n");
        }

       char *str1 = "heavy sea is handsome";
       char *str2 = "is";

       char *ret = strstr(str1,str2);
       puts(ret);//输出 is handsome

10.strlwr strupr

原型:
extern char *strlwr(char *s);

功能:
将字符串s参数转换为小写形式

说明:
只转换s参数中出现的大写字母,不改变其它字符。返回指向s参数的指针。

兼容性说明:
strlwr和strupr不是标准C库函数,只能在VC中使用。linux gcc环境下需要自行定义这个函数。

strupr,
将字符串s转换为大写形式。
说明:只转换s中出现的小写字母,不改变其它字符。返回指向s的指针。

兼容性说明:
strupr不是标准C库函数,只能在VC中使用。在linux gcc环境下需要自行定义这个函数。

注意在windows环境下,需要定义数组形式


char str[] = "Hello World";   //定义成数组
puts(strlwr(str));
puts(strupr(str));

11.strtok

分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。

原型
char *strtok(char s[], const char *delim);
注意:需要定义成数组的形式,否则可能会引起段错误
例如:char str[ ] = “hello world”;

功能
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
例如:strtok(“abc,def,ghi”,","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。
strtok的函数原型为char *strtok(char *s, char *delim),功能为作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。

说明
strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

返回值
从s开头开始的一个个被分割的串。当s中的字符查找到末尾时,返回NULL。
如果查找不到delim中的字符时,返回当前strtok的字符串的指针。
所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。

使用
strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。

       char str4[] ="heavy,sea,hello,world"; //定义成数组
        char *p;
        p = strtok(str4,",");
        if(p != NULL){
                printf("the first str is %s\n",p);
        }

        int i;
        for(i=0;i<3;i++){
                p = strtok(NULL,",");
                if(p != NULL){
                        printf("the str is %s\n",p);
                }

        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值