1、 char *itoa(int value, char *string, int radix)
整形转换成字符串,但该函数实际上不属于c标准库,只是windows和gcc中提供了该接口。
如果无法使用该接口,一般可以使用sprintf进行替代。在leecode中,就不会提供itoa接口。
atoi则是属于c标准库。
备注:sprintf(str,"",...)该函数会自动将str先清0再接收格式化输入,另外所接收的格式化输入均已经是字符了,例如sprintf(str;"%d",100)的输出,str={'1','0','0','\0'},注意字符0('0',48)和数字0
2、 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
c库中提供的快速排序函数。
3、当指针指向一个数组时,是可以通过该指针加下标的方法来访问数组元素的,类同于数组名加数组下标的用法。
如:struct test *p=(struct test *)malloc(sizeof(struct test)*100);
p[0] p[1] ... p[99] p p+1 p+99,这两种方法都可以访问特定的数组元素。
4、利用二维指针动态分配二维数组
int **a=(int**)malloc(sizeof(int*)*m);
for(int i=0;i<m;i++)
a[i]=(int*)malloc(sizeof(int)*n);
5、fgets(str,n,stdin)从标准输入获取一行输入时,str最后会带有换行符/n,strlen(str)的长度包含了换行符;
fgets()函数的返回值类型是一个指向char类型的指针:读取成功,返回str;读取失败,返回NULL。
- 如果在读取EOF之前,已经读取一些字符,此时读取是成功的,fgets()函数返回str;
- 如果在读取EOF之前,一个字符都没读到,此时读取是失败的,fgets()函数返回NULL,str指向的内存空间中储存的字符串保持不变。
scanf("%s", str),从标准输入获取一个字符串,以空格为分割
while(scanf("%s", str)!=EOF) 可以依此获得以空格为分割的字符串,直到标准输入的结束
扩展说明:gets()函数和fgets()函数的主要区别在于安全性和对换行符的处理:
- 安全性。gets()函数没有指定输入字符的大小,如果输入的字符大于定义的数组长度,会发生内存越界,导致程序崩溃或其他数据的错误;fgets()函数会指定输入的大小,如果超出数组大小,会自动根据定义数组的长度截断,这使得fgets()函数更加安全。
- 换行符处理。gets()函数在读取到换行符时停止读取,并将换行符转换为字符串的结束字符'\0',但不接收连续的换行符;fgets()函数在读取到换行符时也会停止读取,但会将换行符作为输入的一部分存入字符串,并在其后添加一个'\0'字符。
此外,fgets()函数还可以从文件中读取数据,而gets()函数只能从标准输入读取。由于gets()函数可能导致的安全问题,它在C11标准和C++17标准中被废弃。
6、long int strtol(const char *nptr, char **endptr, int base);
用法说明:我们将一个字符串nptr在基于base进制的情况下进行分割,遇到第一个不合法的字符就需要停止向后遍历,如果合法就向后遍历,取出合法部分的值给与返回值即可。(此时合法的值和base有关,base为n,这个数就是n进制的值,所以我们在获取值之后如果要用到10进制的值,就需要做个进制转换)。
不合法部分给endptr,也可以不用给,这个时候只需将endptr传NULL即可,base的范围是2-36。
举例说明:如果base = 2 合法部分只能是0和1,
如果base = 8合法部分只能是0-7,如果base = 10合法部分只能是0-9,
如果base = 16合法部分只能是0-F(大小写都可以)
如果base = 36合法部分只能是0-10,a-z(A-Z)。
#include<stdio.h>
int main()
{
char test1[] = "10279ad";
long int binary = 0;
long int octary = 0;
long int dicmal =0;
long int hexad = 0;
binary = strtol(test1,NULL,2);
octary = strtol(test1,NULL,8);
dicmal = strtol(test1,NULL,10);
hexad = strtol(test1,NULL,16);
printf("binary = %ld\n",binary);
printf("octary = %lo\n",octary);
printf("dicmal = %ld\n",dicmal);
printf("hexad = %lx\n",hexad);
}
-bash-4.2$ ./a.out
binary = 2
octary = 1027
dicmal = 10279
hexad = 10279ad
6、浮点数强制转换为整形时只保留整数部分,小数部分全部丢掉
7、C99中引入变长数组,支持使用变量定义数组但是不能初始化
8、getc和fgetc的区别:
int fgetc(FILE * stream);
fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。
fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾。
getc():
功 能: 从流中取字符
用 法: int getc(FILE *stream);
注意: 此函数被ISO C声明为一个宏,所以在用时不能将其做为函数指针传(有一些编译器将其以函数形式也给另说)。它的原型如下 #define getc(_stream) (--(_stream)->_cnt >= 0?0xff & *(_stream)->_ptr++ : _filbuf(_stream))
补充:在C语言中,用函数getc(fgetc)从文件读取字符。getc、fgetc用法相同。 getc的调用形式:ch=getc(fp);此处的fp是文件指针;函数功能是从文件指针指向的文件读入一个字符,并把它作为函数值返回给字符型变量ch。