c/c++ 内部函数整理

本文整理了C/C++中的一些关键内部函数,包括isdigit()用于检查数字字符,atoi()将字符串转为整型,strcmp()和strncmp()进行字符串比较,strcpy()、strncpy()和strlcpy()进行字符串复制,fgets()读取文件行,memset()设置内存区域的值,以及vsnprintf()进行可变参数格式化输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

长期整理总结:

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.

extern char *strcat(char *dest, const char *src);把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。
char * strncat(char *dest, const char *src, size_t n); 把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接

       

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):将可变参数格式化输出到一个字符数组。

  1. char *str [out],把生成的格式化的字符串存放在这里.
  2. size_t size [in], str可接受的最大字符数 (非字节数,UNICODE一个字符两个字节),防止产生 数组越界.
  3. const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。
  4. 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;
}
10. size_t  fread void  * buffer size_t  size size_t  count FILE  * stream ) ;,它从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回 0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值