C语言拾遗

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。

  1. 如果在读取EOF之前,已经读取一些字符,此时读取是成功的,fgets()函数返回str;
  2. 如果在读取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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值