zoukankan      html  css  js  c++  java
  • 【C编程基础】C程序常用函数

    基础知识

    1.const

    const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

    int const x=2;  或  const int x=2; //在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再改变它了

    const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干份拷贝。 

    #define PI 3.14159 //常量宏 
    const double Pi=3.14159; //此时并未将Pi放入RAM中
    double i=Pi; //此时为Pi分配内存,以后不再分配! 
    double I=PI; //编译期间进行宏替换,分配内存 
    double j=Pi; //没有内存分配 
    
    double J=PI; //再进行宏替换,又一次分配内存!

    main函数

    int main(int argc , char* argv[],char* envp[])
    这里有三个参数 :
    第一个:argc是个整形变量,表示命令行参数的个数(含第一个参数,就是含.exe的字符)
    第二个:argv是个字符指针的数组,每个元素是一个字符指针,指向一个字符串,这些字符串就是命令行中的每一个参数
    第三个:envp是字符指针的数组,数组的每一个原元素是一个指向一个环境变量(字符串)的字符指针

    #include <stdlib.h>

     1.putenv和getenv函数

    putenv()用来改变或增加环境变量的内容. 参数string 的格式为name=value, 如果该环境变量原先存在, 则变量内容会依参数string 改变, 否则此参数内容会成为新的环境变量。

    函数原型:int putenv(const char * string);

    返回值:执行成功则返回0, 有错误发生则返回-1。

    getenv()用来取得参数name 环境变量的内容. 参数name 为环境变量的名称, 如果该变量存在则会返回指向该内容的指针. 环境变量的格式为name=value.

    函数原型:char * getenv(const char *name);

    返回值:执行成功则返回指向该内容的指针, 找不到符合的环境变量名称则返回NULL.

    #include <stdlib.h>
    #include <stdio.h>
    int main()
    {
       char *p;
       if((p = getenv("USER")))
       printf("USER =%s
    ",p);
       putenv("USER=test");
       printf("USER=%s
    ", getenv("USER"));
    }
    
    
     执行:
     USER=root
     USER=test
    使用示例

    2. atoi函数

    atoi() 函数用来将字符串转换成整数(int),其原型为:
    int atoi (const char * str);

    3.rand函数与srand函数

    rand()函数是使用线性同余法做的,它并不是真的随机数,因为其周期特别长,所以在一定范围内可以看成随机的。 rand()函数不需要参数,它将会返回0到RAND_MAX之间的任意的整数。

    srand()函数为初始化随机数发生器,用于设置rand()产生随机数时的种子。使用rand()函数时,如果我们不显示调用srand()的话,将默认为srand(1)。

    srand()函数传入的参数seed为unsigned int类型,如果我们为srand设置某个固定的seed,那么虽然在同一次运行时,会有不同的随机数产生,但是对于这段程序的多次运行所得到的结果是不变的。所以通常我们会使用time(0)或time(NULL)的返回值作为seed。

     #include <stdlib.h> 
     #include <stdio.h> 
     #include <time.h> 
     main() 
     { 
        int i,k;
    
       /* 初始化随机数发生器 */
       srand( (unsigned)time( NULL ) ); 
       for( i = 0; i < 10;i++ ) 
      { 
         k=rand()%100+1;   //rand()%100表示取100以内的随机数,即取了随机数后再对100取余  x=rand()%(Y-X+1)+X 
         printf( " k=%d
    ", k ); 
      } 
    }
    使用示例

     #include <stdio.h>

    1.stdin stdout stderr

    标准输入(stdin)、标准输出(stdout)、标准错误(stderr)   

    stdin的默认是从键盘输入,stdout和stderr的默认是输出到屏幕上

    stdout和stderr二者输出是有区别的: 
    stdout输出和cout以及printf输出一样,带有缓存区的输出,先将数据输到缓存区里在遇到换行或者程序结束后输出到屏幕。 
    stderr输出和cerr、flush函数类似,它也是错误输出,直接输出到屏幕,不经过缓存区,但是不同的是stderr不带有清除缓存区的功能。

     2.fopen函数

    fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为: 

    FILE * fopen(const char * path, const char * mode);

    【参数】path为包含了路径的文件名,mode为文件打开方式(模式)。

    3.fscanf函数

    fscanf():从文件指针fp指向的文件中,按format中对应的控制格式读取数据,并存储在agars对应的变量中; 

    原型: fscanf(FILE *fp, const char *format, agars)

    4.fprintf函数

    fprintf():将agars(参数表)内各项的值,按format(格式控制字符串)所表示的格式,将数据格式为字符串的形式写入到文件指针fp指向的文件中。

    原型:fprintf(FILE *fp, const char *format, agars)

     5.fgets函数

    原型  char *  fgets(char * s, int n,FILE *stream);    

        参数:

             s: 字符型指针,指向存储读入数据的缓冲区的地址。

             n: 从流中读入n-1个字符

             stream : 指向读取的流。

       返回值:

              1. 当n<=0 时返回NULL,即空指针。

              2. 当n=1 时,返回空串"".

              3. 如果读入成功,则返回缓冲区的地址。

              4. 如果读入错误或遇到文件结尾(EOF),则返回NULL.

     #include <string.h>

     1.strcmp函数

    函数原型:int strcmp(const char *str1, const char *str2);

    功能:比较两个字符串

    当str1指向的字符串大于str2指向的字符串时,返回正数。

    当str1指向的字符串等于str2指向的字符串时,返回0。

    当str1指向的字符串小于str2指向的字符串时,返回负数。

    2.strcpy 函数

    函数原型:char *strcpy(char *dest, const char *src);

    功能:拷贝字符串src到目标字符串dest

    3.strcat函数 

    函数原型:char *strcat(char *dest, const char *src);

    功能:连接字符串,将字符串src连接在dest之后

    4.strtok函数

    字符串切割函数 

    函数原型:char *strtok(char *s, char *delim);

    函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果。

    5.memcpy函数

    内存复制,它的功能是从src的开始位置拷贝n个字节的数据到dest。如果dest存在数据,将会被覆盖。memcpy函数的返回值是dest的指针。函数原型如下:

    void *memcpy(void *dest, const void *src, size_t n);

     常见问题

    1.编译error:cast from 'void*' to 'int' loses precision

    从 void* 到 int 的转换丢失精度,此问题只会出现在X64位的Linux上,因为在64位的机器上指针占用8个字节,int 占用四个字节,所以才会出现这样的问题。

    char *ptr;  //此后省略部分代码    
    if( (int)ptr==-1 )  //出错地方  
    
    改正为long)ptr == -1

    2.编译warning:cast to pointer from integer of different size(从不同大小的整数转化为指针)

    如果这样定义会出现如下warning提示:
    (void*)virt_to_bus(yuv_frames)
    warning: cast to pointer from integer of different size
    
    改为(void*)(long)virt_to_bus(yuv_frames)

    参考文档:

    C语言---main函数的实现

    C语言putenv()函数和getenv()函数的使用详解

    C语言的fopen()函数

    stdout、stdin和stderr

    C语言atoi()函数:将字符串转换成int(整数)

    C语言之文件读写——fscanf(),fprintf()详解

    C语言文件操作之fgets()

    C语言常用字符串操作函数strcpy、strcat、strcmp、strlen、strchr、strstr的实现

    c,c++中字符串处理函数strtok,strstr,strchr,strsub

    C语言memcpy函数的用法

     

  • 相关阅读:
    2019-11-12-WPF-添加窗口消息钩子方法
    2018-11-21-WPF-解决-ViewBox--不显示线的问题
    ARRAY_SIZE宏
    tcp校验和
    arp命令
    sk_buff
    printf打印字节
    dmesg命令
    insmod/rmmod
    ifup/ifdown
  • 原文地址:https://www.cnblogs.com/badboy200800/p/10025119.html
Copyright © 2011-2022 走看看