Linux C字符串操作函数

1.strcpy函数

原型:strcpy(str1,str2);

功能:将字符串str2复制到字符串str1中,并覆盖str1原始字符串,可以用来为字符串变量赋值

返回:str1

说  明: 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代;

注意:

  1)字符串str2会覆盖str1中的全部字符,

  2)字符串str2的长度不能超过str1,

  3)  拷贝原理:从首元素开始,遇到\0结束

例如:

#include <stdio.h>
#include <string.h>
int main(void)
 {
    char string[10];
    char *str1 = "abcdefghi";
    strcpy(string, str1);
    printf("%s\n", string);  // 输出:abcdefghi
    return 0;
 }
 

2.strncpy函数

原型:strncpy(str1,str2,n);

功能:将字符串str2中的前n个字符复制到字符串str1的前n个字符中

返回:str1

说  明: 不像strcpy(),strncpy()不会向dest追加结束标记'\0';
       src和dest所指的内存区域不能重叠,且dest必须有足够的空间放置n个字符;

注意:

  1)不会清除str1中全部字符串,只会改变前n个字符串,

  2)n不能大于字符串str1、str2的长度

  3)但是如果使用strncpy_s便会清除str1中的全部字符串

例如:

#include <stdio.h>
#include <string.h>
int main(void)
{
   char string[10];
   char *str1 = "abcdefghi";
   strncpy(string, str1, 3);
   string[3] = '\0';
   printf("%s\n", string);  // 输出:abc
   return 0;
}
 

3.strcat函数

原型:strcat(str1,str2);

功能:将字符串str2添加到字符串str1的尾部,也就是拼接两个字符串

返回:str1

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

例如:

#include <string.h>
#include <stdio.h>
int main(void)
{
   char destination[25];
   char *blank = " ", *c = "C++", *Borland = "Borland";
   strcpy(destination, Borland);
   strcat(destination, blank);
   strcat(destination, c);
   printf("%s\n", destination);  // 输出:Borland C++
   return 0;
}
 

4.strncat函数

原型:strncat(str1,str2,n);

功能:将字符串str2的前n个字符添加到字符串str1的尾部

返回:str1

注意:拼接之后的长度不能超过字符串数组str1的长度

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

例如:

#include<stdio.h>
#include<string.h>
int main()
{
    char url[100] = "http://blog.csdn.net";
    char path[30] = "/cpp/u/string/";
    strncat(url, path, 1000);  // 1000远远超过path的长度
    printf("%s\n", url);  // 输出;http://blog.csdn.net/cpp/u/string/
    return  0;
}

5.strlen函数

原型:strlen(str1);

功能:计算字符串str1的长度

返回:一个int值

说  明: strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束;
       如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止;
       sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数;

例如:

#include<stdio.h>
#include<string.h>
int main()
{
    char str[5] = "abcd";
    printf("strlen(str)=%d, sizeof(str)=%d\n", strlen(str), sizeof(str));  // 输出:strlen(str)=4, sizeof(str)=5
    return 0;
}

6.strcmp函数

原型:strcmp(str1,str2);

功能:比较两个字符串,如果两个字符串相等,则返回0;若str1大于str2(对于大于的理解,是指从两个字符串的第一个字符开始比较,若两个字符相同,则继续比较,若发现两个字符不相等,且str1中该字符的ASCII码大于str2中的,则表示str1大于str2),返回一个正数(这个正数不一定是1);若str1小于str2,返回一个负数(不一定是-1);若字符串str1的长度大于str2,且str2的字符与str1前面的字符相同,则也相对于str1大于str2处理

原型2:strncmp(str1,str2,n);

功能2:比较两个字符串的前n个字符

原型3:stricmp(str1,str2); (在Windows中使用stricmp,在Linux中使用strcasecmp)

功能3:忽略两个字符串中的大小写比较字符串,也就是对大小写不敏感。

说  明: 它是区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数
程序例:
#include <string.h>
#include <stdio.h>
int main(void)
 {
    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;
 }

7.strchr函数

原型:strchr(str,c);

功能:在str字符串中查找首次出现字符c的位置(从字符串的首地址开始查找)

原型2:strrchr(str,c);

功能2:在字符串str中从后向前开始查找字符c首次出现的位置

原型3:strstr(str1,str2);

功能3:在字符串str1中查找字符串str2的位置,若找到,则返回str2第一个字符在str1中的位置的指针,若没找到,返回NULL

返回:字符c的位置的指针,若没有查找到字符c,则返回空指针NULL

说  明: 返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串的位置;
       字符串str的结束标志‘\0’也会被纳入检索范围,所以str的最后一个字符也可以被定位;
       如果希望查找某字符在字符串中最后一次出现的位置,可以使用 strrchr() 函数;
程序例:
#include <stdio.h>
#include <string.h>
int main()
{
    char *s = "0123456789012345678901234567890";
    char *p;
    p = strchr(s, '5'); 
    printf("%ld\n", s);  // 输出:134513940
    printf("%ld\n", p);  // 输出:134513945
    p = strrchr(s, '5');
    printf("%ld\n", p);  // 输出:134513965
    return 0;
}

8.strpbrk函数

 原型:strpbrk(str1,str2);

功能:依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置

返回:第一个两个字符串中都包含的字符在str1中的位置的指针

说  明: strpbrk()不会对结束符'\0'进行检索
程序例:
#include<stdio.h>
#include<string.h>
int main(){
    char* s1 = "see you again";
    char* s2 = "you";
    char* p = strpbrk(s1,s2);
    if(p){
        printf("The result is: %s\n",p);  // 输出:The result is: you again 
    }else{
        printf("Sorry!\n");
    }
    return 0;
}

9.字符串转数字atoi、atof、atol函数

atoi(str);    //字符串转换到int整型

atof(str);    //字符串转换到double浮点数

atol(str);    //字符串转换到long整形

{
    // 函数1,字符串转整型,atoi()
    // 说明:扫描字符串,跳过前面的空格,直到遇到数字或正负号则开始转换,遇到非数字或 \0 结束转换,返回转换的值
    // 来源:stdlib.h头文件
    // 扩展:相似的有 atof, atol 顾名思义,就是转float, long
    // 注意:必须本身就是数字的字符串才能被正确转换
    // 举例:
    char *str = "125";

    int i = atoi(str);
    printf("i = %d\n", i);

    // 数字转字符串
    int j = 10005;
    char arr[20];
    sprintf(arr, "%d", j);  //c语言里面不能直接 + 连接,需要这么格式化
    printf("arr = %s\n", arr);

    return 0;
}

10.函数名: strstr

功  能: 检索子串在字符串中首次出现的位置
用  法: char *strstr( char *str, char * substr );
返回值: 返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL
程序例:
#include<stdio.h>
#include<string.h>
int main(){
    char *str = "HelloWorldHelloWorld";
    char *substr = "World";
    char *s = strstr(str, substr); 
    printf("%s\n", s);  // 输出:WorldHelloWorld
    return 0;
}
 
11.函数名: 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-cd : ef";
    char *delim = "-: ";
    char *p;
    printf("%s \n", strtok(s, delim));
    // 输出:ab
    //      cd
    //      ef
    while((p = strtok(NULL, delim)))
        printf("%s ", p);
        printf("\n");
}
 
12. 函数名: strerror
功  能: 返回指向错误信息字符串的指针
用  法: char *strerror(int errnum);
程序例:
#include <stdio.h>
#include <errno.h>
int main(void)
{
   char *buffer;
   buffer = strerror(errno);
   printf("Error: %s\n", buffer);  // 输出:Error: Success
   return 0;
}
 

猜你喜欢

转载自www.cnblogs.com/eokey/p/11810123.html
今日推荐