精华内容
下载资源
问答
  • c语言标准库低通qsort函数不适宜所有排序任务原因: 第一:它只能用于内存中数组排序,不能对链表中数据排序; 第二:因为它参数化函数,所以能对各种数据进行操作,也造成它运行速度比针对单类数据...

    c语言标准库低通的qsort函数不适宜所有排序任务的原因:

    第一:它只能用于内存中的数组排序,不能对链表中的数据排序;

    第二:因为它是参数化的函数,所以能对各种数据进行操作,也造成它的运行速度比针对单类数据排序时慢;

    第三:虽然该函数在一般情况下特别有效,但在某些场合下并不一定是最佳的排序算法。

    展开全文
  • 不同于像read,write这样围绕文件描述符进行直接I/O函数,C语言标准I/O操作都围绕流进行。当我们打开或创建一个文件时,就会将一个流与该文件关联。  在流式I/O操作中,系统会为操作分配缓冲区,以...

      不同于像read,write这样围绕文件描述符进行直接I/O的函数,C语言标准I/O库中的操作都是围绕流进行的。当我们打开或创建一个文件时,就会将一个流与该文件关联。
      在流式的I/O操作中,系统会为操作分配缓冲区,以减少对read、write的调用次数。这是因为read、write是系统调用,调用所耗费的时间要大于普通的函数调用,为什么更耗时我是这样理解的:read、write针对的是文件也即是磁盘中数据的读写操作,而缓冲区则是在内存中开辟的一块空间,显然计算机对于内存的读写操作是要快于磁盘的。通过缓冲区这样的机制,我们可以提高对于文件的频繁读写操作的效率。
      流式的I/O并不总是能提高效率,比如我们要将一个远大于缓冲区容量的数据块一次性写入或读出文件时,缓冲区的机制反而会使系统调用的次数增加,使得效率降低。
      当打开一个流时,fopen函数会返回一个文件指针(FILE*), FILE对象是一个结构,里面存放着管理一个流所相关的信息,包括用于实际I/O的文件描述符、指向该流缓冲区的指针、缓冲区大小、及缓冲区中当前的字符数等。而标准I/O库中的函数则都是围绕文件指针进行的。

    下面用一段代码展示用于流的读写及定位的几个函数的使用方法。

    #include <stdio.h>
    #include <string.h>
    
    int main() {
        FILE *fp; //定义一个文件指针
        char s1[10], s2[] = "abc";
        long offset; //变量offset用于记录文件偏移量
        fp = fopen("text", "w+"); //以读写的方式创建并打开一个文件
        fputs(s2, fp); //将s2写入文件
        rewind(fp); //将文件位置设置在起始位置
        fgets(s1, sizeof(s1), fp); //从文件读取数据到s1
        fputs(s1, stdout); //将s1写入标准输出
        putchar('\n');
        offset = ftell(fp); //获取当前的文件位置
        strcpy(s1,"bcd");
        fputs(s1, fp);
        fseek(fp, 0, SEEK_SET); //将文件位置设置为起始位置
                                //对于文本文件,一定要选用参数SEEK_SET
        fgets(s1, sizeof(s1), fp);
        fputs(s1, stdout);
        putchar('\n');
        fseek(fp, offset, SEEK_SET);  //将文件位置设置为offset所指位置
        fgets(s1, sizeof(s1), fp);
        fputs(s1, stdout);
        putchar('\n');
    
        return 0;
    }

    输出结果

    abc
    abcbcd
    bcd
    展开全文
  • c运行库、c标准库、windows API区别和联系 C运行时库函数 C运行时库函数C语言本身支持一些基本函数,通常汇编直接实现。   API函数 API函数操作系统为方便用户设计应用程序而提供实现...

    c运行库、c标准库、windows API的区别和联系

    C运行时库函数
    C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的。
      
    API函数
    API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的。

    区别
    他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的。

    ·1、运行时库就是 C run-time library,是C而非C++语言世界的概念。
         取这个名字就是因为你的C程序运行时需要这些库中的函数。

    ·2、C语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);
         所以,C语言内核开发出来之后,Dennis Ritchie和Brian Kernighan就用C本身重写了90%以上的UNIX系统
         函数,并且把其中最常用的部分独立出来,形成头文件和对应的LIBRARY,C run-time Library就是这样
         形成的。 

    ·3、随后,随着C语言的流行,各个C编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应
         的Standard Library,但大部分实现都是与各个平台有关的。由于各个C编译器对C的支持和理解有很多
         分歧和微妙的差别,所以就有了ANSI C;ANSI C(主观意图上)详细的规定了C语言各个要素的具体含义
         和编译器实现要求,引进了新的函数声明方式,同时订立了Standard Library的标准形式。所以C运行时
         库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方C运行库
        (Third party C runtime libraries)。

    ·4、C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序
         可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()
         就不会被调用,exit()也不能被响应。因为 C run-time Library 包含了C程序运行的最基本和最常用的
         函数。

    ·5、到了C++世界里,有另外一个概念:Standard C ++ Library,它包括了上面所说的C run-time Library
         和STL。包含C run-time Library的原因很明显,C++是C的超集,没有理由再重新来一个C++ run-time
         Library。VC针对C++加入的Standard C ++ Library主要包括:LIBCP.LIB、LIBCPMT.LIB和MSVCPRT.LIB。

    ·6、Windows环境下,VC提供的 C run-time Library又分为动态运行时库和静态运行时库。  

    动态运行时库
    动态运行时库主要包括:
    ·DLL库文件:msvcrt.dll(或 MSVCRTD.DLL for debug build)
    ·对应的Import Library文件:MSVCRT.LIB(或 MSVCRTD.LIB for debug build)

    静态运行时库
    静态运行时库(release版)对应的主要文件包括:  
    ·LIBC.LIB(Single thread static library, retail version)  
    ·LIBCMT.LIB(Multithread static library, retail version)  
       
        msvcrt.dll提供几千个C函数,即使是像printf这么低级的函数都在msvcrt.dll里。其实你的程序运行时,很大一部分时间是在这些运行库里运行。在你的程序(release版)被编译时,VC会根据你的编译选项(单线程、多线程或DLL)自动将相应的运行时库文件(libc.lib、libcmt.lib或Import Library msvcrt.lib)链接进来。

     

    2.C运行时库的作用

      C运行时库除了给我们提供必要的库函数调用(如memcpy、printf、malloc等)之外,它提供的另一个最重要的功能是为应用程序添加启动函数。

      C运行时库启动函数的主要功能为进行程序的初始化,对全局变量进行赋初值,加载用户程序的入口函数。

      不采用宽字符集的控制台程序的入口点为mainCRTStartup(void)。下面我们以该函数为例来分析运行时库究竟为我们添加了怎样的入口程序。这个函数在crt0.c中被定义,下列的代码经过了笔者的整理和简化:

    void mainCRTStartup(void)
    {
     int mainret;
     /*获得WIN32完整的版本信息*/
     _osver = GetVersion();
     _winminor = (_osver >> 8) & 0x00FF ;
     _winmajor = _osver & 0x00FF ;
     _winver = (_winmajor << 8) + _winminor;
     _osver = (_osver >> 16) & 0x00FFFF ;

     _ioinit(); /* initialize lowio */

     /* 获得命令行信息 */
     _acmdln = (char *) GetCommandLineA();

     /* 获得环境信息 */
     _aenvptr = (char *) __crtGetEnvironmentStringsA();

     _setargv(); /* 设置命令行参数 */
     _setenvp(); /* 设置环境参数 */

     _cinit(); /* C数据初始化:全局变量初始化,就在这里!*/

     __initenv = _environ;
     mainret = main( __argc, __argv, _environ ); /*调用main函数*/

     exit( mainret );
    }


      从以上代码可知,运行库在调用用户程序的main或WinMain函数之前,进行了一些初始化工作。初始化完成后,接着才调用了我们编写的main或WinMain函数。只有这样,我们的C语言运行时库和应用程序才能正常地工作起来。

      除了crt0.c外,C运行时库中还包含wcrt0.c、 wincrt0.c、wwincrt0.c三个文件用来提供初始化函数。wcrt0.c是crt0.c的宽字符集版,wincrt0.c中包含 windows应用程序的入口函数,而wwincrt0.c则是wincrt0.c的宽字符集版。

      Visual C++的运行时库源代码缺省情况下不被安装。如果您想查看其源代码,则需要重装Visual C++,并在重装在时选中安装运行库源代码选项。

     

     下面看一个未正确使用C运行时库的控制台程序:

     

    #include 
    #include 
    int main()
    {
     CFile file;
     CString str("I love you");
     TRY
     {
      file.Open("file.dat",CFile::modeWrite | CFile::modeCreate);
     }
     CATCH( CFileException, e )
     {
      #ifdef _DEBUG
      afxDump << "File could not be opened " << e->m_cause << "\n";
      #endif
     }
     END_CATCH

     

     file.Write(str,str.GetLength());
     file.Close();
    }

     

      我们在"rebuild all"的时候发生了link错误:

     

    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
    nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
    main.exe : fatal error LNK1120: 2 unresolved externals
    Error executing cl.exe.

     

      发生错误的原因在于Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程。我们只需要在Visual C++6.0中依次点选Project->Settings->C/C++菜单和选项,在Project Options里修改编译选项即可。

     

     

    C运行库和C标准库的关系

     

    C标准库,顾名思义既然是标准,就是由标准组织制定的。是由“美国国家标准协会(American National Standards Institute,ANSI)”为了规范C语言库而制定的标准。在最初,各个大学各个公司使用的C语言库都不尽相同,造成相互移植非常困难,在这个背景下,制定了这个标准。

     

    C运行库,是和平台相关的,即和操作系统相关的。它由不同操作系统不同开发平台提供不同的C运行库。但是C运行库的部分实现是基于C标准库的,即C运行库是各个操作系统各个开发工具根据自身平台开发的库,某种程度上,可以说C运行库是C标准库的一个扩展库,只是加了很多C标准库所没有的与平台相关的或者不相关的库接口函数。举例子如:c标准库的strcpy函数负责字符串的拷贝,但是由于缺少对目地字符串缓冲区大小的控制,极有可能导致缓冲区溢出(大量的缓冲区溢出攻击都是由于这种漏洞而产生的);相反,Windows提供了能够实现同样功能的安全的字符串拷贝函数,减少了缓冲区攻击的可能,strcpy_s。这些函数是以c运行库的方式提供的,当然,不同的操作系统,c运行时库可能不同,但是对c标准库的支持是完全一致的,也就是说,在不同的操作系统上,使用同一个c标准库的函数必然产生一致的结果。

     

    C标准库中提供的有:

     

    l           标准输入输出(stdio.h)。

     

    l           文件操作(stdio.h)。

     

    l           字符操作(ctype.h)。

     

    l           字符串操作(string.h)。

     

    l           数学函数(math.h)。

     

    l           资源管理(stdlib.h)。

     

    l           格式转换(stdlib.h)。

     

    l           时间/日期(time.h)。

     

    l           断言(assert.h)。

     

    l           各种类型上的常数(limits.h & float.h)。

     

    你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C   run-time库,main()就不会被调用,exit()也不能被响应。因为C   run-time   library包含了C程序运行的最基本和最常用的函数。  

     

    如下是C运行库与C标准库的关系:

     

    一个C运行库大致包含了如下功能:

     

    l           启动与退出:包括入口函数及入口函数所依赖的其他函数等。

     

    l           标准函数:由C语言标准规定的C语言标准库所拥有的函数实现。(C标准库

     

    l           I/O:I/O功能的封装和实现,参见上一节中I/O初始化部分。

     

    l           堆:堆的封装和实现,参见上一节中堆初始化部分。

     

    l           语言实现:语言中一些特殊功能的实现。

     

    l           调试:实现调试功能的代码。

     

    操作系统API和C运行库CRT,C标准库之间区别

    首先,C语言要早于Windows出现,而且C语言实际标准制定的开始时间也要早于Windows(API概念出现的)系统的开发时间。所以Windows系统在开发的时候是完全可以使用C语言的。目前最多的说法是用C和汇编实现的。那么只要用C,就可能用C标准库。

    我们假设两种情况,一是Windows API的实现包含部分C标准库函数的功能实现,这就决定了这部分操作系统API的实现是由调用标准库实现的,那么在发布时需要加入所用到的c标准库DLL一同发布。

     二是微软的内核(包括API)开发是使用着一个和平台严格相关的C语言的静态的链接库,这样不必提供Dll也能开发和发行。而且必然的这个C库是在汇编的基础上实现的,也就是说这个库里面的C函数都是(至少有很大比例)披着C语法的汇编代码。

    要你是微软,你选择哪个呢?也许是两者兼而有之,也许是后者。

    一般情况下,我们说C运行库暗含的意思是哪种平台哪个开发平台的C运行库,

    CRT的实现是基于Windows API的,而WindowsAPI的开发也是基于C语言的,但不是或者不一定基于CRT(或者C标准库)的。

    再深一步,虽然CRT是基于操作系统 API实现的,但并不代表所有的CRT封装了操作系统 API,如一些用户的权限控制,操作系统线程创建等都不属于C运行库,于是对于这些操作我们就不得不直接调用操作系统API或者其他库。

    总结一下,C标准库就是任何平台都可以使用的基本C语言库。而CRT除了将C标准库加入所属范围外,还扩展了与平台相关的接口库,这些接口实现根据不同平台调用不同平台的操作系统API。

    如下图所示,采用C标准库编写的程序可以应用到windows平台,也可以应用到linux平台;而用CRT另外与平台相关的库函数编写的应用程序不能跨平台运行。

     

    而不同平台的操作系统API实现,是用C标准库呢,还是汇编呢,这个可有,可没有。毕竟那么多windows API只要发现一个调用C标准库的了,就有了。概念理解了即可,至于微软实现的时候基于何种考虑不使用C标准库,或者使用C标准库都有自己的考虑。那就是操作系统内部的研究范围了,等我知道了之后再确定这点。哈哈。。。。。。

    展开全文
  • c语言的文件操作

    2020-11-27 18:18:30
    //以下FILE一个C标准库已经定义好结构体,返回结果为“文件指针”(即:句柄) //如果文件打开失败,返回NULL FILE* f = fopen("D:/test.txt", "w");//第二个参数为'r',针对文本文件 if (f == NULL) { ...

    文件的四个核心操作:
    1、打开文件 fopen
    2、读文件 fread
    3、写文件 fwrite
    4、关闭文件 fclose

    打开文件:fopen()

    //打开文件
    	//以下的FILE是一个C标准库已经定义好的结构体,返回结果为“文件指针”(即:句柄)
    	//如果文件打开失败,返回NULL
    	FILE* f = fopen("D:/test.txt", "w");//第二个参数为'r',针对文本文件
    	if (f == NULL) {
    		perror("文件打开失败");
    		//等价代码:printf("文件打开失败! errno=%d,%s\n",errno,strerror(errno));
    		system("pause");
    		return 1;
    	}
    	printf("文件打开成功\n");
    
    

    在这里插入图片描述

    读文件:fread()

    //fread:把磁盘上的数据读取到内存中
    	char buf1[1024] = {0};
    	//fread中第二个参数:一个元素占多少个字节,第二个参数:想要读多少个元素,二者相乘为想读的整体字节数
    	//返回值为:实际读取到的元素个数
    	int n1 = fread(buf1, 1, 1024, f);
    	printf("%s\n", buf1);
    

    写文件:fwrite()

    //fwrite:把内存中的数据写到磁盘上
    	//如果写入成功:返回实际写入磁盘中的元素个数
    	//如果写入失败,返回一个<0的结果
    	char buf2[] = "bitbit";
    	int n2 = fwrite(buf2, 1, strlen(buf2), f);
    	//如果实际写入元素个数小于数组长度,写入失败,输出错误原因
    	if (n2< strlen(buf2) ){
    		//perror():用来将上一个函数发生错误的原因输出到标准设备(stderr)
    	perror("fwrite");
    	}
    

    在这里插入图片描述

    注意:
    在这里插入图片描述

    在进行fwrite操作时,此处的fopen函数的第二个参数必须为**“w”**,否则会出现以下问题:
    在这里插入图片描述

    其中:file descriptor:是文件描述符

    关闭文件:fclose()

    //关闭文件
    	fclose(f);
    

    sprintf:字符串格式化命令

    //sprintf():把整数转成字符串
    	int num = 10;
    	char buf3[1024] = { 0 };
    	//将int数据放入到char buf3[]这个数组中
    	sprintf(buf3, "%d", num);//该操作不是输出	
        printf("%c\n", buf3[0]);
        printf("%c\n", buf3[1]);
    	//此处会有一个'\0'输出
    	printf("%c\n", buf3[2]);
    	printf("%s\n", buf3);
    
    

    在这里插入图片描述

    sscanf:读取格式化的字符串中的数据

    //sscanf():从一个字符串中读出与指定格式相符的数据
    	char buf4[100];
    	sscanf("bitbit", "%3s",buf4 );
    	printf("%s\n", buf4);
    
    

    在这里插入图片描述

    整体代码:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main() {
    	//打开文件
    	//以下的FILE是一个C标准库已经定义好的结构体,返回结果为“文件指针”(即:句柄)
    	//如果文件打开失败,返回NULL
    	FILE* f = fopen("D:/test.txt", "w");//第二个参数为'r',针对文本文件
    	if (f == NULL) {
    		perror("文件打开失败");
    		//等价代码:printf("文件打开失败! errno=%d,%s\n",errno,strerror(errno));
    		system("pause");
    		return 1;
    	}
    	printf("文件打开成功\n");
    
    	//fread:把磁盘上的数据读取到内存中
    	char buf1[1024] = {0};
    	//fread中第二个参数:一个元素占多少个字节,第二个参数:想要读多少个元素,二者相乘为想读的整体字节数
    	//返回值为:实际读取到的元素个数
    	int n1 = fread(buf1, 1, 1024, f);
    	printf("%s\n", buf1);
    
    	//fwrite:把内存中的数据写到磁盘上
    	//如果写入成功:返回实际写入磁盘中的元素个数
    	//如果写入失败,返回一个<0的结果
    	char buf2[] = "bitbit";
    	int n2 = fwrite(buf2, 1, strlen(buf2), f);
    	//如果实际写入元素个数小于数组长度,写入失败,输出错误原因
    	if (n2< strlen(buf2) ){
    		//perror():用来将上一个函数发生错误的原因输出到标准设备(stderr)
    	perror("fwrite");
    	}
    
    	//sprintf():把整数转成字符串
    	int num = 10;
    	char buf3[1024] = { 0 };
    	//将int数据放入到char buf3[]这个数组中
    	sprintf(buf3, "%d", num);//该操作不是输出	
        printf("%c\n", buf3[0]);
        printf("%c\n", buf3[1]);
    	//此处会有一个'\0'输出
    	printf("%c\n", buf3[2]);
    	printf("%s\n", buf3);
    
    
    	//sscanf():从一个字符串中读出与指定格式相符的数据
    	char buf4[100];
    	sscanf("bitbit", "%3s",buf4 );
    	printf("%s\n", buf4);
    
    	//关闭文件
    	fclose(f);
    	system("pause");
    	return 0;
    }
    
    

    在这里插入图片描述

    展开全文
  • 1 ARM标准库介绍 ADS提供了ANSI C和C++标准库,本文仅讨论ANSI C库,该库包含下面几个部分: ◇IS0 C库标准所定义函数; ◇在semlhosted环境下用来实现C库函数与目标相关函数; ◇C和C++编译器要使用...
  • C语言参考手册pdf

    2018-02-09 16:04:00
    下载地址:网盘下载内容简介······《C语言参考手册(原书第5版)》...第二部分讨论了C语言的标准库针对它们不同的功能分别进行详细介绍。为了帮助读者理解相关概念,《C语言参考手册(原书第5版)》在讨论C语...
  • C++标准库

    千次阅读 2019-06-09 23:19:10
    C语言兼容库:头文件带.h,C++编译器提供商为推广自己产品,而提供C兼容库(不是C++标准库提供),内置C库。 C++标准库:如string、cstdio(注意,不带.h)C++标准库提供。使用时要用using namespace...
  • C++ 标准库简介

    2020-12-09 15:39:14
    C语言兼容库:头文件带.h,C++编译器提供商为推广自己产品,而提供C兼容库(不是C++标准库提供),内置C库。 C++标准库:如string、cstdio(注意,不带.h)C++标准库提供。使用时要用using namespace...
  • 库是少量基本容器又一个实现,已针对速度进行了优化。 libarchive简化接口允许以压缩形式保存容器。 所有容器都是32位。 这在64位系统上极大地提高了性能(最高约32%)并减少了内存消耗(最高41%)。 ...
  • C 标准库系列之概述

    2019-10-04 15:43:53
    基本上很多编程语言都会提供针对语言本身的一系列的标准库或者包,当然C语言同样也有提供标准库,C语言的标准库是一系列的头文件的集合;如assert.h、ctype.h、errno.h、float.h、limits.h、locale.h、math.h、...
  • ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库、LL库 三种。 其中标准库与HAL库最常用,LL...HAL库与新增的LL库,都ST公司提供的新标准库,包含在ST为新的标准库注册了一个新商标:STM
  • STM32标准库与HAL库总结

    万次阅读 2019-05-16 15:09:46
    其中标准库与HAL库最常用,LL库只是最近新添加。 标准外设库(Standard Peripherals Library)对STM32芯片一个完整封装,包括所有标准器件外设器件驱动器。这应该目前使用最多ST库,几乎全部使用...
  • c++标准库摘要

    2019-10-24 19:29:58
    C语言兼容库:头文件带.h,C++编译器提供商为推广自己产品,而提供C兼容库(不是C++标准库提供),内置C库。 C++标准库:如string、cstdio(注意,不带.h)C++标准库提供。使用时要用using namespace ...
  • C运行时库函数C运行时库函数是指C语言本身...区别他们之间区别是:API函数是针对操作系统C语言运行时函数则是针对C语言本身。 ·1、运行时就是 C run-time library,是C而非C++语言世界概念。取这个名字...
  • 1.编译过程:将.c文件转成二进制文件。 C语言中,每个.c文件都视为一个“编译单元”...链接过程除了要链接用户自己写文件编译.o之外,还需要链接一些库文件(标准库,第三方库),此处库可以动态库方式提
  • 到这一点,因为许多头文件和函数是针对某些特定编译程序或平台。有些(很少!)语言扩充性能,例如基 于 Intel 编译程序所使用 near和 far 关键字以及寄存器伪变量,也只不过是某种平台开发商们所认可...
  • 第二部分讨论了c语言的标准库针对它们不同的功能分别进行详细介绍。为了帮助读者理解相关概念,《c语言参考手册(原书第5版)》在讨论c语言及其标准库的细节时,提供了许多实例和解释。第一部分的各章还提供了练习题...
  • 1- 初识C语言(概览)

    2021-03-25 21:01:20
    在使用VS2013~VS2019开发环境,尽量使用标准的C语言库,不要使用VS内(比如scanf在VS内报错,正确的是scanf_s,但是标准Cscanf,为了代码移植,最好不要用) 初识C语言 %c -- 打印字符格式数据 %d -- ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 202
精华内容 80
关键字:

c语言的标准库是针对

c语言 订阅