#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a = (char *)malloc(sizeof(char) * 10);
char w[30]="WWWWWWWWWWWWWWWWWWWWWWWWWWWW";
printf("w[30]: %c \n", w[30]); //越界
memcpy(a, "123456789", 10);
memcpy(a+10, "123456789", 10);
for (int i = 0; i < 20; i++) {
printf("before, %c\n", *(a + i));
}
strncat(a, w, 5); // 超出a的大小
printf("a: %s, a: %p\n", a, a);
for (int i = 0; i < 20; i++) {
printf("after, %c\n", *(a + i));
}
return 0;
}
打印
w[30]:
before, 1
before, 2
before, 3
before, 4
before, 5
before, 6
before, 7
before, 8
before, 9
before,
before, 1
before, 2
before, 3
before, 4
before, 5
before, 6
before, 7
before, 8
before, 9
before,
a: 123456789WWWWW, a: 0x55e3aee24260
after, 1
after, 2
after, 3
after, 4
after, 5
after, 6
after, 7
after, 8
after, 9
after, W
after, W
after, W
after, W
after, W
after,
after, 6
after, 7
after, 8
after, 9
after,
strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。
如果n小于字符串src的长度,那么仅拷贝n 个字符到dest字符串尾部, 字符追加完成后,再追加'\0'。
如果n大于字符串src的长度,那么仅将src指向的字符串内容追加到dest的尾部。
strncat()会将dest字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0'。
// 当使用像strncat()函数时,必须在缓冲区的末尾为终止空字符留下一个空字节,避免off-by-one strncat(fullname, lastname, sizeof(fullname) - strlen(fullname) - 1);
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char firstname[30] = "123456789123456789";
char fullname[10] = "**********";
fullname[0] = '\0';
strncat(fullname, firstname, 6);
for (int i = 0; i < 10; i++) {
printf("[i:%d], %c, %s\n", i, fullname[i], fullname);
}
return 0;
}
打印
[i:0], 1, 123456
[i:1], 2, 123456
[i:2], 3, 123456
[i:3], 4, 123456
[i:4], 5, 123456
[i:5], 6, 123456
[i:6], , 123456
[i:7], *, 123456
[i:8], *, 123456
[i:9], *, 123456