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 的复制是以空字符 ' ' 为结束条件的。因此必须保证 s2 以 ' ' 结尾,否则将会导致数组越界。s1 必须能容纳 strlen(s2) + 1 个字符,否则也会导致数组越界。
结果字符串末尾必定添加 ‘ ’
最大复制字符数:strlen(s2) + 1 (+1 是包括了 ‘ ’)
返回
strcpy 函数返回 s1 的值。
概要:
#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个字符中没有空字符,则结果将不会以 ‘ ’ 结尾。
注意1:strncpy 函数对 s2 的复制是以写入 n 个字符为结束条件的,如果 s2 长度小于 n ,则会追加 n - strlen(s2) 个 ' ' 字符。
注意2:当 s2 长度等于或大于 n 时,不会在结果字符串的末尾添加 ' ' 字符,这很可能会在引用 s1 所指向的结果字符串时导致数组越界。s1 必须能容纳 n 个字符,否则也会导致数组越界。
结果字符串末尾不一定添加 ‘ ’
最大复制字符数:n
返回
strncpy 函数返回 s1 的值。
概要:
#include <string.h>
char *strcat(char *restrict s1, const char *restrict s2);描述:
strcat 函数将 s2 所指向的字符串的副本(包括末尾的空字符)追加到 s1 所指向的字符串的末尾。s2 的初始字符覆盖 s1 末尾的空字符。如果复制发生在重叠的对象之间,则行为是未定义的。
注意1:strcat 函数对 s2 的复制是以空字符 ' ' 为结束条件的。因此必须保证 s2 以 ' ' 结尾,否则将会导致数组越界。
注意2:s2 的副本是追加到 s1 末尾的,因此必须保证 s1 是以 ' ' 字符结尾的,否则在追加时将会导致数组越界。s1 从末尾的 ' ' 字符(会被覆盖)开始,必须还能继续容纳 strlen(s2) + 1 个字符,否则也会导致数组越界。
结果字符串末尾必定添加 ‘ ’
最大复制字符数:strlen(s2) + 1 (+1 是包括了 ‘ ’)
返回
strcat 函数返回 s1 的值。
概要:
#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 从末尾的 ' ' 字符(会被覆盖)开始,必须还能继续容纳 n + 1 个字符,否则将会导致数组越界。
结果字符串末尾必定添加 ‘ ’
最大复制字符数:n + 1 (+1 是包括了 ‘ ’)
返回
strncat 函数返回 s1 的值。