关于c:字符串和内存函数

6次阅读

共计 3111 个字符,预计需要花费 8 分钟才能阅读完成。

字符操作函数

strlen() 求字符串长度

#include <string.h>
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 <string.h>
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 <string.h>
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 <string.h>
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[] = "abcde@daef.foce";
    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 <string.h>
#include <errno.h>
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 <string.h>
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 的指针。
正文完
 0