C/C++ 语言初学者必备:字符串处理函数入门

一、字符串操作函数

头文件:<string.h>。以str开头的是字符串处理函数,默认遇到'\0'结束操作。

1.1、测量字符串的长度:strlen

strlen函数是一个C标准库函数,用于计算字符串的长度(不包括结束符\0)。它的原型定义在string.h头文件中:

size_t strlen(const char *s);

其中,参数s是需要计算长度的字符串的首元素地址,返回值为该字符串的长度。

举个例子:

#include <stdio.h>

#include <string.h>

 

int main() {

    char str[] = "Hello, world!";

    printf("The length of '%s' is %d.\n", str, strlen(str));

    char str2[] = "Hel\0lo, world!";

    printf("The length of '%s' is %d.\n", str2, strlen(str2));

    return 0;

}

输出结果:

The length of 'Hello, world!' is 13.

The length of 'Hel' is 3.

注意:strlen函数只能用于以null字符'\0'结尾的字符串。如果传递给它一个非空字符数组或者指针,但是没有以'\0'结尾,那么它可能会一直扫描内存直到遇到一个'\0'为止,这将导致不可预测行为和内存访问错误。

1.2、字符串拷贝函数:strcpy

strcpy函数是一个 C 标准库函数,用于将一个字符串复制到另一个字符串中。它的原型定义在string.h头文件中:

char *strcpy(char *dest, const char *src);

char *strncpy(char *dest, const char *src, size_t n);

其中,参数dest是目标字符串(也就是要拷贝到的字符串),src是源字符串(也就是要被拷贝的字符串),n是要拷贝的最大字节数(如果遇到'\0'会自动结束)。返回值为指向目标字符串的指针。

举个例子:

#include <stdio.h>

#include <string.h>

 

int main() {

    char src[] = "Hello, world!";

    char dest[20];

    strcpy(dest, src);

    printf("The copied string is: '%s'\n", dest);

    return 0;

}

输出结果:

The copied string is: 'Hello, world!'

需要注意的一点是,在使用strcpy函数时,目标字符数组必须足够大以容纳源字符数组的内容及结尾符号'\0',否则会发生缓冲区溢出和未定义行为问题。

strcpy和strncpy都是 C 语言字符串拷贝函数,用于将一个字符串复制到另一个字符串中。它们的区别在于:

    1    参数类型不同:strcpy的第一个参数是char *dest,第二个参数是const char *src;而strncpy的第一个参数也是char *dest,但第二个参数是const char *src,并且有一个额外的int参数n表示要拷贝的最大字符数。

    2    处理方式不同:strcpy会将源字符串全部拷贝到目标字符串中,并在目标字符串末尾添加'\0'结尾符;而strncpy则只会拷贝源字符串中前n个字符(不包括'\0'),如果源字符串长度小于n,则剩余部分用'\0'填充。

因此,在使用这两个函数时需要根据具体需求选择合适的函数。如果需要完整地复制源字符串,可以使用strcpy;如果需要只复制源字符串前几个字符并控制拷贝长度,可以使用strncpy。

下面给出一个示例代码:

#include <stdio.h>

#include <string.h>

 

int main() {

    char src[] = "Hello, world!";

    char dest1[20];

    char dest2[10];

    

    // 使用strcpy将src复制到dest1

    strcpy(dest1, src);

    printf("The copied string using strcpy is: '%s'\n", dest1);

    

    // 使用strncpy将src前6个字符复制到dest2

    strncpy(dest2, src, 6);

    dest2[6] = '\0'; // 手动添加结尾符号

    printf("The copied string using strncpy is: '%s'\n", dest2);

    

    return 0;

}

输出结果:

The copied string using strcpy is: 'Hello, world!'

The copied string using strncpy is: 'Hello'

1.3、字符串追加函数:strcat

strcat和strncat都是C语言中的字符串追加函数,用于将源字符串追加到目标字符串的末尾。

它们的原型分别为:

char *strcat(char *dest, const char *src);

char *strncat(char *dest, const char *src, size_t n);

其中,dest表示目标字符串,src表示源字符串,n表示要复制的字符数。两个函数都会返回一个指向目标字符串的指针。

使用strcat时需要注意以下几点:

    1    目标字符串必须有足够的空间来容纳源字符串和结尾符'\0'。

    2    源字符串不会被修改,只有目标字符串会发生变化。

    3    如果源字符串以'\0'结尾,则追加过程中会把'\0'一起复制到目标串中;如果没有'\0'结尾,则结果未定义。

使用strncat时需要注意以下几点:

    1    目标字符串必须有足够的空间来容纳源字符串前n个字符和结尾符'\0'。

    2    如果源字符串长度小于n,则只会复制整个源串,并在其后添加'\0'。

    3    如果源字符串长度大于等于n,则只会复制前n个字符,并在其后添加'\0'。

示例代码:

#include <stdio.h>

#include <string.h>

 

int main() {

    char str1[20] = "Hello, ";

    char str2[] = "world!";

    

    // 使用strcat将str2追加到str1末尾

    strcat(str1, str2);

    

    printf("The concatenated string is: '%s'\n", str1);

    

    char str3[20] = "Hello, ";

    char str4[] = "world!";

    

    // 使用strncat将str4的前5个字符追加到str3末尾

    strncat(str3, str4, 5);

    

    printf("The concatenated string is: '%s'\n", str3);

    

    return 0;

}

输出结果:

The concatenated string is: 'Hello, world!'

The concatenated string is: 'Hello, world'

1.4、字符串比较函数:strcmp

strcmp和strncmp都是C语言中的字符串比较函数,用于比较两个字符串是否相等。

它们的原型分别为:

int strcmp(const char *s1, const char *s2);

int strncmp(const char *s1, const char *s2, size_t n);

其中,s1和s2分别表示要比较的两个字符串,n表示要比较的字符数。两个函数都会返回一个整数值,代表比较结果。如果返回值为0,则表示两个字符串相等;如果返回值小于0,则表示第一个不同字符在s1中出现的位置小于在s2中出现的位置;如果返回值大于0,则表示第一个不同字符在s1中出现的位置大于在s2中出现的位置。

使用strcmp时需要注意以下几点:

    1    该函数会一直比较下去,直到找到不同或者遇到'\0'。

    2    如果两个字符串完全相同,则该函数返回0。

    3    如果第一个不同字符在s1中出现的位置小于在s2中出现的位置,则该函数返回负数;反之则返回正数。

使用strncmp时需要注意以下几点:

    1    该函数只会比较前n个字符。

    2    如果前n个字符完全相同,则该函数返回0。

    3    如果第一个不同字符在s1中出现的位置小于在s2中出现的位置,则该函数返回负数;反之则返回正数。

示例代码:

#include <stdio.h>

#include <string.h>

 

int main() {

    char str1[] = "Hello, world!";

    char str2[] = "hello, World!";

    

    // 使用strcmp比较str1和str2是否相等

    if (strcmp(str1, str2) == 0) {

        printf("The strings are equal.\n");

    } else {

        printf("The strings are not equal.\n");

    }

    

    char str3[] = "Hello, world!";

    char str4[] = "hello, World!";

    

    // 使用strncmp比较str3和str4的前5个字符是否相等

    if (strncmp(str3, str4, 5) == 0) {

        printf("The first 5 characters of the strings are equal.\n");

    } else {

        printf("The first 5 characters of the strings are not equal.\n");

    }

    

    return 0;

}

输出结果:

The strings are not equal.

The first 5 characters of the strings are equal.

二、字符串查找函数

2.1、字符串查找字符函数:strchr

在C语言中,strchr函数用于查找某个字符在字符串中第一次出现的位置,并返回该位置指针。其函数原型为:

char *strchr(const char *s, int c);

其中,s是待查找的字符串,c是要查找的字符。如果在字符串s中找到了字符c,则返回该字符在字符串s中第一次出现的位置指针;如果没有找到,则返回NULL。

例如:

#include <stdio.h>

#include <string.h>

 

int main() {

    char str[] = "hello world";

    char *ptr = strchr(str, 'l');

    if (ptr != NULL) {

        printf("The first occurrence of 'l' in '%s' is at position %ld.\n", str, ptr - str + 1);

    } else {

        printf("The character 'l' is not found in '%s'.\n", str);

    }

    return 0;

}

上述代码输出结果为:

The first occurrence of 'l' in 'hello world' is at position 3. 

表示字符'l'第一次出现在字符串"hello world"的第3个位置(从1开始计数)。

2.2、字符串查找子串函数:strstr

在C语言中,strstr函数用于查找某个子串在字符串中第一次出现的位置,并返回该位置指针。其函数原型为:

char *strstr(const char *haystack, const char *needle);

其中,haystack是待查找的字符串,needle是要查找的子串。如果在字符串haystack中找到了子串needle,则返回该子串在字符串haystack中第一次出现的位置指针;如果没有找到,则返回NULL。

例如:

#include <stdio.h>

#include <string.h>

 

int main() {

    char str[] = "hello world";

    char sub[] = "world";

    char *ptr = strstr(str, sub);

    if (ptr != NULL) {

        printf("The first occurrence of '%s' in '%s' is at position %ld.\n", sub, str, ptr - str + 1);

    } else {

        printf("The substring '%s' is not found in '%s'.\n", sub, str);

    }

    return 0;

}

上述代码输出结果为:

The first occurrence of 'world' in 'hello world' is at position 7. 

表示子串"world"第一次出现在字符串"hello world"的第7个位置(从1开始计数)。

三、其他字符串处理函数

3.1、字符串分割函数:strtok

在C语言中,strtok函数用于分割字符串为多个子串。它的原型为:

char *strtok(char *str, const char *delim);

其中,参数str是要被分割的字符串,参数delim是一个包含所有可能作为分隔符的字符集合(即分隔符列表)。该函数返回值为指向下一个被分割出来的子串的指针。

例如:

#include <stdio.h>

#include <string.h>

 

int main() {

    char str[] = "apple,banana,cherry,date";

    char *ptr = strtok(str, ",");

    while (ptr != NULL) {

        printf("%s\n", ptr);

        ptr = strtok(NULL, ",");

    }

    return 0;

}

上述代码输出结果为:

apple

banana

cherry

date

表示将字符串"apple,banana,cherry,date"按照逗号进行分割,并输出各个子串。

3.2、格式化的数据写入字符串:sprintf

在C语言中,sprintf函数用于将格式化的数据写入字符串中。它的原型为:

int sprintf(char *str, const char *format, ...);

其中,参数str是一个指向要写入数据的字符数组的指针,参数format是一个包含格式化占位符(如%d、%f等)的字符串,后面可跟多个与占位符相对应的实际值。

该函数返回值为成功写入到字符数组中的字符数(不包括末尾的空字符),如果发生错误则返回负值。

例如:

#include <stdio.h>

 

int main() {

    char str[100];

    int n = 123;

    float f = 3.14;

    sprintf(str, "n=%d, f=%.2f", n, f);

    printf("%s\n", str);

    return 0;

}

上述代码输出结果为:

n=123, f=3.14

表示将整数变量n和浮点数变量f按照指定格式输出,并将结果写入到字符串str中。

3.3、读取格式化的数据函数:sscanf

在C语言中,sscanf函数用于从一个字符串中读取格式化的数据。它的原型为:

int sscanf(const char *str, const char *format, ...);

其中,参数str是一个指向要读取数据的字符数组的指针,参数format是一个包含格式化占位符(如%d、%f等)的字符串,后面可跟多个与占位符相对应的实际值。

该函数返回值为成功读取到的参数数量(如果有错误,则返回已经成功读取的数量),如果发生错误则返回负值。

例如:

#include <stdio.h>

 

int main() {

    char str[] = "n=123, f=3.14";

    int n;

    float f;

    sscanf(str, "n=%d, f=%f", &n, &f);

    printf("n=%d, f=%.2f\n", n, f);

    return 0;

}

上述代码输出结果为:

n=123, f=3.14

表示从字符串str中按照指定格式读取整数变量n和浮点数变量f,并将它们输出到屏幕上。

四、总结

C语言中常用的字符串处理函数有以下几个:

    1    strlen:计算字符串的长度,即字符数组中不包括'\0'字符的字符数。

    2    strcpy:将一个字符串复制到另一个字符串中,包括'\0'在内。

    3    strncpy:将一个字符串的前n个字符复制到另一个字符串中,如果源字符串长度小于n,则会在末尾加上'\0'。

    4    strcat:将两个字符串连接起来,即将第二个字符串拼接到第一个字符串后面,并在末尾添加'\0'。

    5    strncat:将两个字符串的前n个字符连接起来,如果源字符串长度小于n,则会在末尾添加'\0'。

    6    strcmp:比较两个字符串是否相等,返回值为0表示相等。

    7    strncmp:比较两个字符串的前n个字符是否相等,返回值为0表示相等。

    8    strchr:查找某个字符在字符串中第一次出现的位置,并返回该位置指针。

    9    strstr:查找某个子串在主串中第一次出现的位置,并返回该位置指针。

除了以上这些常用函数外,还有其他一些函数如strtok、sprintf、sscanf、memset、memcpy等都属于C语言中常用的字符串处理函数。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值