jlibc的一些函数
void setbuf(FILE *stream, char *buffer)
- 给stream一个buffer的缓冲区
- buffer – 这是分配给用户的缓冲,它的长度至少为 BUFSIZ 字节,BUFSIZ 是一个宏常量,表示数组的长度。(也可自己定义)
#include <stdio.h>
int main()
{
char buf[BUFSIZ];
setbuf(stdout, buf);// 把缓冲区与流相连
puts("This is runoob");
fflush(stdout);
return(0);
}
stdio属于即使输出;
通常在此之后该流就是全缓冲的,但是如果该流与一个终端设备相关,那么某些系统也可以将其设置为行缓冲。为了关闭缓冲,可以将buf参数设置为NULL。
当缓冲区满了或者用fflush()逼空缓冲区,输出
- int setvbuf(FILE * stream, char * buf, int type, unsigned size);
stream为文件流的指针 , buf为缓存区的地址, typedef为类型 , size为字节数量
type的类型
- _IOFBF _IOFBF (满缓冲):当缓冲区为空时,从流读入数据。或当缓冲区满时,向流写入数据。
- _IOLBF (行缓冲):每次从流中读入一行数据或向流中写入—行数据。
- _IONBF (无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
#include <stdio.h>
int main(void)
{
FILE *input, *output;
char bufr[512];
input = fopen("file.in", "w+"); /*打开文件*/
output = fopen("file.out", "w");
if (setvbuf(input, bufr, _IOFBF, 512) != 0) /*失败*/
{
printf("failed to set up buffer for input file\n");
}
else
{
printf("buffer set up for input file\n");
}
if (setvbuf(output, NULL, _IOLBF, 132) != 0) /*为流指定特殊的缓冲区*/
{
printf("failed to set up buffer for output file\n");
}
else
{
printf("buffer set up for output file\n");
}
fclose(input);
fclose(output);
return 0;
}
说明:在打开文件流后,读取内容之前,调用setvbuf()可以用来设置文件流的缓冲区(而且必须是这样)。
- setbuf()和setvbuf()函数的实际意义在于:用户打开一个文件后,可以建立自己的文件缓冲区,而不必使用fopen()函数打开文件时设定的默认缓冲区。这样就可以让用户自己来控制缓冲区,包括改变缓冲区大小、定时刷新缓冲区、改变缓冲区类型、删除流中默认的缓冲区、为不带缓冲区的流开辟缓冲区等。
double strtod(const char *str, char **endptr)
- 返回值是 double类型
- endptr 为字符串
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[30] = "20.30300 This is test";
char *ptr;
double ret;
ret = strtod(str, &ptr);
printf("数字(double)是 %lf\n", ret);
printf("字符串部分是 |%s|", ptr);
return(0);
}
- 只会返回最前端的数字字符串 ,, 其余全当字符串处理
long int strtol(const char *str, char **endptr, int base)
把参数 str 所指向的字符串转换为一个长整数(类型为 long int 型)。 base代表采用进制方式2~36
// --------------------------------------------------
void *memchr(const void *str, int c, size_t n)
- 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。返回位置之后的字符串。
#include <stdio.h>
#include <string.h>
int main ()
{
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = (char*)memchr(str, ch, strlen(str));
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
- int memcmp(const void *str1, const void *str2, size_t n)
- 把 str1 和 str2 的前 n 个字节进行比较。
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
memcpy(str1, "abcdef", 6);
memcpy(str2, "ABCDEF", 6);
ret = memcmp(str1, str2, 5);
if(ret > 0)
{
printf("str2 小于 str1");
}
else if(ret < 0)
{
printf("str1 小于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
-
void *memcpy(void *str1, const void *str2, size_t n)
- 从存储区 str2 复制 n 个字符到存储区 str1。
- 从存储区 str2 复制 n 个字符到存储区 str1。
-
void *memmove(void *str1, const void *str2, size_t n)
- 在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
- 在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
-
char *strcat(char *dest, const char *src)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
#include <stdio.h>
#include <string.h>
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
printf("最终的目标字符串: |%s|", dest);
return(0);
}