1.strncat
strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。如果n大于字符串src的长度,那么仅将src指向的字符串内容追加到dest的尾部。strncat()会将dest字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0'。
void foo (char *s)
{
char buf[15];
memset(buf, 0, sizeof(buf));
strncat(buf, s, sizeof(buf)); // Final parameter should be: sizeof(buf)-1 ========================>strncat会自动加‘\0'
}
例子:
char value_temp[VALUEMAXLEN] = {0};
strncat(value_temp, kDefaultValue_VendorName, sizeof(value_temp) - 1);
strncat(value_temp, " battery backup system", sizeof(value_temp) - strlen(value_temp) - 1);
2.strncpy
strncpy复制字符串src中的内容(字符,数字、汉字....)到字符串dest中,复制多少由size_t n的值决定。如果src的前n个字符不含NULL字符,则结果不会以NULL字符结束。如果n<src的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加'\0',也就是结果dest不包括'\0',需要再手动添加一个'\0'。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+'\0'。
enum { BUFFER_SIZE = 10 };
char str1[BUFFER_SIZE];
strncpy(str1,str2, BUFFER_SIZE); /* limit number of characters */
/* hundle \0 termination */
if (str1[BUFFER_SIZE-1] != '\0') {
/* buffer truncated, do something */================================>strncpy不会自动加'\0'
}
3.snprintf
snprintf将可变个参数(...)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
#include <stdio.h>
int main () {
char a[16];
size_t i;
i = snprintf(a, 13, "%012d", 12345); // 第 1 种情况
printf("i = %lu, a = %s\n", i, a); // 输出:i = 12, a = 000000012345
i = snprintf(a, 9, "%012d", 12345); // 第 2 种情况
printf("i = %lu, a = %s\n", i, a); // 输出:i = 12, a = 00000001
return 0;
}
int length = snprintf(buffer, BUFFER_SIZE, "%s%s", "long-name", "suffix");
if (length >= BUFFER_SIZE) {
/* handle string truncation! */
}======================================================>snprintf会自动加'\0'
4.fgets
fgets()读字符串函数fgets()的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针),要从键盘输入时文件指针的参数为:stdin ;其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'/0'。
char *fgets(char *str, int n, FILE *stream)