strcpy、strncpy、strcat 和 strncat 函数描述及数组越界陷阱

strcpy、strncpy、strcat 和 strncat 函数描述及数组越界陷阱

strcpy 函数

概要

  #include <string.h>

char *strcpy(char *restrict s1, const char *restrict s2);

描述

  strcpy 函数将 s2 所指向的字符串(包括末尾的空字符)复制到s1所指向的数组中。如果复制发生在重叠的对象之间,则行为是未定义的。

注意:strcpy 函数对 s2 的复制是以空字符 '\0' 为结束条件的。因此必须保证 s2 以 '\0' 结尾,否则将会导致数组越界。s1 必须能容纳 strlen(s2) + 1 个字符,否则也会导致数组越界。

结果字符串末尾必定添加 ‘\0’
最大复制字符数:strlen(s2) + 1 (+1 是包括了 ‘\0’)

返回

  strcpy 函数返回 s1 的值。
  
  
  

strncpy 函数

概要

  #include <string.h>

char *strncpy(char *restrict s1, const char *restrict s2, size_t n);

描述

  strncpy 函数从 s2 所指向的数组复制不超过n个字符(空字符后面的字符不会被复制)到 s1 所指向的数组[1]。如果复制发生在重叠的对象之间,则行为是未定义的。如果 s2 指向的数组是一个小于 n 个字符的字符串,则 s1 指向的数组的副本将追加空字符,直到总共写入 n 个字符为止

[1] 因此,如果在s2所指向的数组的前n个字符中没有空字符,则结果将不会以 ‘\0’ 结尾。

注意1:strncpy 函数对 s2 的复制是以写入 n 个字符为结束条件的,如果 s2 长度小于 n ,则会追加 n - strlen(s2) 个 '\0' 字符。

注意2:当 s2 长度等于或大于 n 时,不会在结果字符串的末尾添加 '\0' 字符,这很可能会在引用 s1 所指向的结果字符串时导致数组越界。s1 必须能容纳 n 个字符,否则也会导致数组越界。

结果字符串末尾不一定添加 ‘\0’
最大复制字符数:n

返回

  strncpy 函数返回 s1 的值。
  
  
  

strcat 函数

概要

  #include <string.h>

char *strcat(char *restrict s1, const char *restrict s2);

描述

  strcat 函数将 s2 所指向的字符串的副本(包括末尾的空字符)追加到 s1 所指向的字符串的末尾。s2 的初始字符覆盖 s1 末尾的空字符。如果复制发生在重叠的对象之间,则行为是未定义的。

注意1:strcat 函数对 s2 的复制是以空字符 '\0' 为结束条件的。因此必须保证 s2 以 '\0' 结尾,否则将会导致数组越界。

注意2:s2 的副本是追加到 s1 末尾的,因此必须保证 s1 是以 '\0' 字符结尾的,否则在追加时将会导致数组越界。s1 从末尾的 '\0' 字符(会被覆盖)开始,必须还能继续容纳 strlen(s2) + 1 个字符,否则也会导致数组越界。

结果字符串末尾必定添加 ‘\0’
最大复制字符数:strlen(s2) + 1 (+1 是包括了 ‘\0’)

返回

  strcat 函数返回 s1 的值。
  
  
  

strncat 函数

概要

  #include <string.h>

char *strncat(char *restrict s1, const char *restrict s2, size_t n);

描述

  strncat 函数从 s2 所指向的数组向 s1 所指向的字符串末尾追加不超过n个字符(空字符及其后面的字符不追加)。s2 的初始字符覆盖 s1 末尾的空字符。空字符总是被附加到结果中[2]。如果复制发生在重叠的对象之间,则行为是未定义的。

[2] 因此,s1 所指向的数组中的总的最大字符数是 strlen(s1) + n + 1。

注意:strncat 函数总是会追加空字符到结果中,因此 s1 从末尾的 '\0' 字符(会被覆盖)开始,必须还能继续容纳 n + 1 个字符,否则将会导致数组越界。

结果字符串末尾必定添加 ‘\0’
最大复制字符数:n + 1 (+1 是包括了 ‘\0’)

返回

  strncat 函数返回 s1 的值。
  
  
  

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值