字符串和内存函数

字符操作函数

strlen()求字符串长度

#include 
size_t strlen(const char *str)
  • str :要计算长度的字符串的首地址。
  • size_t :这是unsigned int类型,是无符号的。
  • 注意 :必须读取到 \0 才算结束,但是返回的长度不包括结尾字符 \0。
char arr1[] = "abcd";
char arr2[] = {'a','b','c','d'};
int a = strlen(arr1);  //a的值为4
int c = strlen(arr2);  
//c的值无法确认,因为数组后面没有\0,所以strlen要一直计算到有 \0的地方才结束
//所以C的值可能会很大

字符串拷贝

strcpy()

#include 
char *strcpy(char *dest, const char *src)
  • 把 src 所指向的字符串复制到 dest。
  • 该函数返回一个指向最终的目标字符串 dest 的指针(即返回dest的地址)
  • 注意:源字符串 src 必须以 \0 结尾,否则程序会崩溃
  • 这个函数会将源字符串中的 \0 也拷贝过去。
  • 注意:目标dest空间的值必须可变,才能放下源字符串。
char* arr1 = "abcde";
char arr2[] = "qwer";
strcpy(arr1,arr2);     //这种用法是错误的,程序会崩溃
// 因为arr1 是常量字符串,是不可更改的,所以会崩溃。

strncpy()

char *strncpy(char *dest, const char *src, size_t n)
  • n :指定要从 src 中拷贝的字符个数。
  • 当源字符串 src 中没有 n 个字符时,任然会拷贝 n 个字符(剩余的用 '\0' 填充)

字符串追加

strcat()

#include 
char *strcat(char *dest, const char *src)
  • 作用:将src中的字符串追加到 dest 字符串后面。
  • dest :指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
  • src :指向要追加的字符串,该字符串不会覆盖目标字符串。
  • 返回值:返回一个指针,指向dest。
  • 这种方法追加字符串,可以追加自己。
  • 注意:

    • 源字符串 src和dest 都必须要有 '\0' 。
    • 追加时,在dest 的 '\0' 处开始追加,直到src的 '\0' 追加完后结束(把 '\0' 也追加过去)
    • dest 空间内的值必须是可变的,不能是常量。

strncat()

char *strncat(char *dest, const char *src, size_t n)
  • n :要追加的最大字符数。

字符串比较

strcmp()

int strcmp(const char *str1, const char *str2)
  • 作用: 把 str1 所指向的字符串和 str2 所指向的字符串进行比较(比较对应字符的ASCII码)
  • 注意:这个不是比较字符串长度,是比较对应位置上的字符大小,如果相同就比较下一对,直到 '\0' 为止。如果不相同,则返回比较结果。
  • 返回值:

    • 返回值小于 0,则表示 str1 小于 str2。
    • 返回值大于 0,则表示 str1 大于 str2。
    • 返回值等于 0,则表示 str1 等于 str2。

strncmp()

int strncmp(const char *str1, const char *str2, size_t n)
  • n :指定要比较的最大字符数(比较前 n 个字符)

strstr()检索字符串的位置

#include 
char *strstr(const char *bigChar, const char *litterChar)
  • 函数作用:在大字符串中搜索小字符串第一次出现的位置。
  • bigChar : 大字符串。
  • litterChar :小字符串。
  • 返回值 :返回在 bigChar 中第一次出现 litterChar 字符串的位置,如果未找到则返回 null。

strtok()字符串分解

char *strtok(char *str, const char *delim)
  • 作用 :分解字符串 str 为一组字符串,delim 为分隔符。
  • str :字符串
  • delim :分隔符

    • 分隔符为字符串时,字符串中每个字符都是一个分隔符
    • 这个函数会将 str 字符串中与分隔符相同的字符,变为 '\0'。
  • 返回值:返回被分解的第一个子字符串,如果没有分割,则返回一个空指针。
  • 注意:当 str 为NULL时,会从上次标记的位置开始找。
int main()
{
    char arr[] = "[email protected]";
    char buf[30] = { 0 };
    strcpy(buf, arr);
    const char* sep = "@.";
    printf("%s\n", strtok(buf, sep));  //从buf地址开始找
    printf("%s\n", strtok(NULL, sep)); //从上次标记的位置往后开始找
    printf("%s\n", strtok(NULL, sep));
    return 0;
}
输出结果:
abcde
daef
foce

strerror()根据错误码返回错误信息

#include 
#include 
char *strerror(int errnum)
  • 作用 :从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。
  • errnum : 错误号码,一般是errno(程序出错时,编译器会将错误码存放到errno中)
  • 注意 :strerror 生成的错误字符串取决于开发平台和编译器。
printf("%s\n",strerror(errno)); //打印错误信息。

perror()打印错误信息

void perror(const char *str)  //直接将错误信息打印出来,而strerror只是找到错误信息位置
  • str : 这是字符串,是一个自定义消息,将显示在原本的错误消息之前。

字符转换函数

tolower()转换为小写字母

int tolower(int c);
  • c :要被转换为小写的字母。
  • 返回值:如果 c 有相对应的小写字母,则返回 c 的小写字母,否则 c 保持不变
  • 返回值是一个可被隐式转换为 char 类型的 int 值。

toupper()转换为大写字母

int toupper(int c);

内存操作函数

memcpy()内存拷贝

#include 
void *memcpy(void *str1, const void *str2, size_t n)
  • 函数作用 : 从存储区 str2 复制 n 个字节到存储区 str1。
  • 注意 :这个函数的拷贝是针对内存的,无论内存中的数据是什么类型。

memmove()重叠内存拷贝

void *memmove(void *str1, const void *str2, size_t n)
  • 函数功能:可以实现跟 memcpy 相同的功能,并且可以进行重叠内存的拷贝。

    • 如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。
  • 在VS编译器中,memcpy也能实现重叠内存拷贝。

memcmp()内存比较

int memcmp(const void *str1, const void *str2, size_t n)
  • 函数功能 :把存储区 str1 和存储区 str2 的前 n 个字节进行比较
  • n : 要比较的字节数。
  • 返回值 :

    • 返回值 < 0,则表示 str1 小于 str2
    • 返回值 > 0,则表示 str1 大于 str2
    • 返回值 = 0,则表示 str1 等于 str2
  • 注意:这个内存比较是不会在意是否存在 '\0' 的。

memset()内存填充

void *memset(void *str, int c, size_t n)
  • 函数作用 :将字符串 str 的前 n 个字符全部填充为字符 c(一个字符就是一个字节,所以它是以字节为单位进行填充的)
  • 返回值 :返回一个指向存储区 str 的指针。

你可能感兴趣的:(c)