0
点赞
收藏
分享

微信扫一扫

标准库

kiliwalk 2022-07-18 阅读 98

@[TOC]

atof 字符数字double化

double atof(const char *str)

返回的是浮点数

参数是一个字符串数字

如果处理失败就返回0

#include <stdio.h>
#include <stdlib.h>

int main()
{
char str[20]="3.1415926";
printf("字符串值 = %s, 浮点值 = %lf\n", str, atof(str));

return 0;
}

输出

字符串值 = 3.1415926, 浮点值 = 3.14159
请按任意键继续. . .

atoi 字符数字 int 化

int atoi(const char *str)

​const char *str​​:字符串数字

返回字符串的int值

如果处理失败就返回0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

char str[20]="3.1415926";
printf("字符串值 = %s, 整型值 = %d\n", str, atoi(str));
return(0);
}

输出

字符串值 = 3.1415926, 整型值 = 3
请按任意键继续. . .

atol 字符数字long int 化

#include <stdio.h>
#include <stdlib.h>

int main()
{
long NUm;
char str[20];

strcpy(str, "98993489");
NUm = atol(str);
printf("字符串值 = %s, 长整型值 = %ld\n", str, NUm);

return(0);
}

同时也要注意数据的范围是不是超对应的数据

itoa 数字字符串化

char *itoa(int S_NUm,char *D_Str,int base);

数字源

目的字符串

以多少进制写进去

#include<stdio.h>
#include<stdlib.h>


int main(void)
{

int S_NUm = 1725;

char D_Str[10]={0};

int base=10;

itoa(S_NUm,D_Str,base);

printf("integer = %d string = %s\n",S_NUm,D_Str);

return 0;

}

类似的还有很多

abort 异常退出

void abort(void)

没有返回值,只是到时候中途退出

#include <stdio.h>
#include <stdlib.h>

int main ()
{
FILE *fp;

printf("准备打开 xxxx_nofile.txt\n");
fp = fopen( "xxxx_nofile.txt","r" );
if(fp == NULL)
{
printf("准备终止程序\n");
abort();
}
//不会执行
printf("准备关闭 nofile.txt\n");
fclose(fp);

return(0);
}

输出

准备打开 xxxx_nofile.txt
准备终止程序

atexit 正常退出时调用自定义的函数

int atexit(void (*func)(void))

如果函数成功注册,则该函数返回零,否则返回一个非零值。

#include <stdio.h>
#include <stdlib.h>

void func()
{
printf("我是程序最后的退出关口A\n");
}

int main ()
{
/* 注册终止函数 */
atexit(func);

printf("启动主程序...\n");
printf("退出主程序...\n");

return(0);
}

getenv() 返回一个对象在计算机的位置的字符串指针

char *getenv(const char *name)

#include <stdio.h>
#include <stdlib.h>

int main ()
{
printf("PATH : %s\n", getenv("PATH"));
printf("HOME : %s\n", getenv("HOME"));
printf("ROOT : %s\n", getenv("ROOT"));

return(0);
}

然后会输出地址

没有就返回null

bsearch() 二分操作

下面是 bsearch() 函数的声明。

void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))

  • key-- 指向要查找的元素的指针,类型转换为 void*。
  • base-- 指向进行查找的数组的第一个对象的指针,类型转换为 void*。
  • nitems-- base 所指向的数组中元素的个数。
  • size-- 数组中每个元素的大小,以字节为单位。
  • compar-- 用来比较两个元素的函数

函数cmpfunc

int cmpfunc(const void *p1, const void *p2);

如果 cmpfunc 返回值小于 0(< 0),那么 p1 所指向元素会被排在p2所指向元素的前面

如果 cmpfunc 返回值等于 0(= 0),那么 p1 所指向元素与 p2 所指向元素的顺序不确定

如果 cmpfunc 返回值大于 0(> 0),那么 p1 所指向元素会被排在 p2 所指向元素的后面。

这段代码有问题

可能死机

#include <stdio.h>
#include <stdlib.h>


int cmpfunc (const void * a, const void * b)
{
const int *aa = (int*) a;
const int *bb = (int*)b;
if (*aa < *bb)
return -1;
else if (*aa > *bb)
return 1;
else
return 0;
}

int arr[10] = { 9,8,7,6,5,4,3,2,1,0};

int main ()
{
int *item;
int answer = 2;

int* get_what=&answer;
int how_many=10;
int single_len=sizeof (int);


item = (int*) bsearch (get_what, arr, how_many,single_len, cmpfunc);

if( item != NULL )
{
printf("Found item = %d\n", *item);
}
else
{
printf("Item = %d could not be found\n", *item);
}

return(0);
}

qsort 自动排序

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
qsort(values, 5, sizeof(int), cmpfunc);

base: 一个数组的地址

nitems:数组的长度

size:每个数据的长度

int (*compar)(const void , const void)):函数指针

#include <stdio.h>
#include <stdlib.h>

int values[] = { 1,3,5,2,4, };

int cmpfunc (const void * a, const void * b)
{
const int *aa = (int*) a;
const int *bb = (int*)b;
if (*aa < *bb)
return -1;
else if (*aa > *bb)
return 1;
else
return 0;
}
int main()
{
int n;

printf("排序之前的列表:\n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}

qsort(values, 5, sizeof(int), cmpfunc);

printf("\n排序之后的列表:\n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}

return(0);
}

compare的写法

int cmpfunc (const void * a, const void * b)
{
const int *aa = (int*) a;
const int *bb = (int*)b;
if (*aa < *bb)
return -1;
else if (*aa > *bb)
return 1;
else
return 0;
}

不安全的,有可能会产生溢出。

int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}

int cmpfunc (const void * a, const void * b)
{
return *(int *)a < *(int *)b ? -1 : *(int *)a > *(int *)b;
}

mblen()

int mblen(const char *str, size_t n)

str -- 指向多字节字符的第一个字节的指针。 n -- 要检查的字符长度的最大字节数。

不太理解

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int len;
char *pmbnull = NULL;
char *pmb = (char *)malloc( MB_CUR_MAX );

wchar_t *pwc = L"Hi";
wchar_t *pwcs = (wchar_t *)malloc( sizeof( wchar_t ));

printf("转换为多字节字符串\n");

len = wcstombs( pmb, pwc, MB_CUR_MAX);
printf("被转换的字符 %d\n", len);
printf("第一个多字节字符的十六进制值:%#.4x\n", pmb);

len = mblen( pmb, MB_CUR_MAX );
printf( "多字节字符 %x 的字节长度:%u\n", pmb, len );

pmb = NULL;

len = mblen( pmb, MB_CUR_MAX );
printf( "多字节字符 %x 的字节长度:%u\n", pmb, len );

return(0);
}

输出

转换为多字节字符串
被转换的字符 1
第一个多字节字符的十六进制值:0x168c6010
多字节字符 168c6010 的字节长度:1
多字节字符 0 的字节长度:0

类似的还有

size_t mbstowcs( wchar_t* dst, const char* src, std::size_t len);

int mbtowc(whcar_t *pwc, const char *str, size_t n)

size_t wcstombs(char *str, const wchar_t *pwcs, size_t n)

int wctomb(char *str, wchar_t wchar)

举报

相关推荐

0 条评论