长期整理总结:
1.isdigit() :主要用于检查其参数是否为十进制数字字符,若参数c为阿拉伯数字0~9,则返回非0值,否则返回NULL。
2. int atoi (const char *string): 将字符串转化为整形.
3. int strcmp(const char *s1, const char *s2): 当s1<s2时,返回为负数;当s1==s2时,返回值= 0;当s1>s2时,返回正数.
4.int strncmp ( const char * str1, const char * str2, size_t n ) : 比较s1,s2的前n位,相等return 0;不等返回s1[i] - s2[2];
5.char *strcpy(char* dest, const char *src); 把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
size_t strlcpy(char *dst, const char *src, size_t siz): 类似的函数还有strncpy,但是strlcpy常常是更加安全地选择,因为strlcpy在复制之后dst字符串一定会以'\0'字符结尾.
char *strncpy(char *s1, const char *s2, size_t n);
在 ANSI C 中,strcpy 的安全版本是 strncpy
char *strncpy(char *s1, const char *s2, size_t n);
但 strncpy 其行为是很诡异的(不符合我们的通常习惯)。标准规定 n 并不是 sizeof(s1),而是要复制的 char 的个数。一个最常见的问题,就是 strncpy 并不帮你保证 /0
结束。
char buf[8];
strncpy( buf, "abcdefgh", 8 );
看这个程序,buf 将会被 "abcdefgh" 填满,但却没有 /0 结束符了。
另外,如果 s2 的内容比较少,而 n 又比较大的话,strncpy 将会把之间的空间都用 /0 填充。这又出现了一个效率上的问题,如下:
char buf[80];
strncpy( buf, "abcdefgh", 79 );
上面的 strncpy 会填写 79 个 char,而不仅仅是 "abcdefgh" 本身。
strncpy 的标准用法为:(手工写上 /0)
strncpy(path, src, sizeof(path) - 1);
path[sizeof(path) - 1] = '/0';
len = strlen(path);
6.
7. char * fgets (char *s, int count, FILE *stream):从文件stream中每次读取一行,读取的数据保存在s指向的字节,每次最多读取count-1 个字节.如果文件中的该行,不足bufsize-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断.
8.void *memset(void *s, int ch,size_t n);将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s ,memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法:memset(buf,0,sizeof(char *)*4);
9. int vsnprintf (char *s, size_t size, const char *template, va_list ap):将可变参数格式化输出到一个字符数组。
-
char *str [out],把生成的格式化的字符串存放在这里.
-
size_t size [in], str可接受的最大字符数 (非字节数,UNICODE一个字符两个字节),防止产生 数组越界.
-
const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。
-
va_list ap [in], va_list变量. va:variable-argument:可变参数
用法实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
#include <stdarg.h>
int
mon_log(
char
* format, ...)
{
char
str_tmp[50];
int
i=0;
va_list
vArgList;
//定义一个va_list型的变量,这个变量是指向参数的指针.
va_start
(vArgList, format);
//用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
i=_vsnprintf(str_tmp, 50, format, vArgList);
//注意,不要漏掉前面的_
va_end
(vArgList);
//用va_end宏结束可变参数的获取
return
i;
//返回参数的字符个数中间有逗号间隔
}
//调用上面的函数
void
main()
{
int
i=mon_log(
"%s,%d,%d,%d"
,
"asd"
,2,3,4);
printf
(
"%d\n"
,i);
}
|
输出9, asd,2,3,4 共计9字节.
返回值用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char
*make_message(
const
char
*fmt, ...)
{
/* 初始时假设我们只需要不超过100字节大小的空间 */
int
n, size = 100;
char
*p;
va_list
ap;
if
( (p = (
char
*)
malloc
(size*
sizeof
(
char
))) == NULL)
return
NULL;
while
(1)
{
/* 尝试在申请的空间中进行打印操作 */
va_start
(ap, fmt);
n = vsnprintf (p, size, fmt, ap);
va_end
(ap);
/* 如果vsnprintf调用成功,返回该字符串 */
if
(n > -1 && n < size)
return
p;
/* vsnprintf调用失败(n<0),或者p的空间不足够容纳size大小的字符串(n>=size),尝试申请更大的空间*/
size *= 2;
/* 两倍原来大小的空间 */
if
((p = (
char
*)
realloc
(p, size*
sizeof
(
char
))) == NULL)
return
NULL;
}
}
int
main()
{
/* 调用上面的函数 */
char
* str = make_message(
"%d,%d,%d,%d"
,5,6,7,8);
printf
(
"%s\n"
,str);
free
(str);
/* we allocate the memory in the make_message function, so we should release it by caller(main function). */
return
0;
}
|