c语言函数

初学C语言4.7-C语言的读写操作

扶醉桌前 提交于 2019-12-18 08:21:49
函数快查--------https://fishc.com.cn/thread-66397-1-1.html C语言的文件操作 文件的读写操作 EOF :文件结束符 读取单个字符 fgetc:一个函数 getc:一个宏的实现 写入单个字符 fputc putc 关闭文件操作 fclose(); 有读取文件就有关闭文件,二者总在一起 将字符串在文件中读取 fgets gets 将字符串写入到文件中 fputs puts #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { FILE *fp; struct tm *p; time_t t; time(&t); p = localtime(&t); if((fp = fopen("date.txt","w"))==NULL) { PRINTF("打开文件失败\n"); exit(EXIT_FAILURE); } fprintf(fp,"%d-%d-%d",1900 + p->tm_year,1 + p->tm_mon,p->tm_mday); fclose(fp); //以上代码为写入 int year,month,day; if((fp = fopen("date.txt","w"))==NULL) { PRINTF("打开文件失败\n");

C语言面试题(四)--------------------网上题目

别来无恙 提交于 2019-12-17 16:14:31
1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 注:此题我在Xcode上用了来,的确,如果是两个循环的话,都可以用同名的变量,这在objective-c中是可以的,但我不记得在Java和C中是否可以了 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错. 4、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 答: 1) 全局变量

C语言指针(五)--函数指针

夙愿已清 提交于 2019-12-17 05:49:33
在第四篇关于链表的文章中读者可以通过实现单向链表了解简单的指针应用。但是,在这之中出现了函数指针和空指针。在这篇文章中将对这两方面的内容做讨论。 说实话我现在我快崩溃了,这是我第三遍写这篇文章,前两遍都是在我正要发布的时候莫名其妙的没有啦。所以。。。。。。先提三个问题 1.定义一个函数指针,返回值为int参数为空。 2.定义一个函数指针,返回值int参数为int。 3.定义一个返回int指针的函数参数为int。 4.定义一个返回函数指针的函数参数为空,返回的函数指针参数和返回值都是int。 对于C语言基础较好的读者,前两个问题应该不成问题,但是第三个问题就不是所有读者都可以搞定了。 1. int ( * fun ) ( void ) ; 2 int ( * fun ) ( int ) ; 3. int * fun ( int prg ) { } 4. ? 我们观察前两个问题的答案,可能会发现函数指针的定义其实就是在函数定义的基础之上把函数名用括号括起来然后在函数名前加一个星号。 所以第四个问题的答案可能是这样的 int ( * fun ) ( int ) function ( void ) { } 可是我们观察第四个问题答案发现返回的指针并没有指针名所以应该把上面的定义改写成这样 int ( * fun ( void ) ) ( int ) {} 至于为什么是这样而不是这样 int

Java相关知识2

♀尐吖头ヾ 提交于 2019-12-17 05:32:00
11、是否可以从一个static方法内部发出对非static方法的调用? 不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。 12、Integer与int的区别 int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。 例如:要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。 在Hibernate中,如果将OID定义为Integer类型

C语言博客作业06--结构体&文件

别说谁变了你拦得住时间么 提交于 2019-12-16 13:53:17
1.本章学习总结 1.1 学习内容总结 1.结构的介绍 结构(Structure)类型是一种允许程序员把一些数据分量聚合成一个整体的数据类型,一个结构中包含的每个数据分量都有名字。这些数据分量称为结构成员或者结构分量,结构成员可以是C语言中的任意变量类型,程序员可以使用结构类型来创建适合于问题的数据聚合。 像数组和指针一样,结构也是一种构造数据类型(或叫派生数据类型),它与数组的区别在于:数组中所有元素的数据类型必须是相同的,而结构中各成员的数据类型可以不同。 2.结构是C语言中一种新的构造数据类型,它能够把有内在联系的不同类型的数据汇聚成一个整体,使它们相互关联;同时,结构又是一个变量的集合, 可以按照对基本数据类型的操作方达单独使用其成员变量。 3.在C语言中,整型、实型等基本数据类型是被系统预先定义好了的,程序员可以用其直接定义变量。而结构类型是由用户根据需要,按规定的格式自行定义的数据类型。 4.结构类型定义的一般形式为: struct 结构名 { 类型名 结构成员名1; 类型名 结构成员名2; … 类型名 结构成员名n; }; 5.struct是定义结构类型的关量字,在struct之后,自行命名一个结构名,它必须是一个合法的C标识符。struct与结构名两者合起来共同组成结构类型名,大括号内的内容是结构所包括的结构成员,也叫结构分量。结构成员可以有多个,这样

C语言--传值与传指针

人盡茶涼 提交于 2019-12-16 04:44:53
我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底有什么区别呢?如果你还不能准确地分辨,就该好好了解一下了。 传值 我们在初学C语言的时候就被老师教过,下面的方式是无法交换a和b的值的: #include<stdio.h> void swap(int a,int b) { int temp = a; a = b; b = temp; printf("internal swap a = %d,b = %d\n",a,b); } int main(void) { int a = 10; int b = 20; printf("before swap:a = %d,b = %d\n",a,b); swap(a,b); printf("after swap:a = %d,b = %d\n",a,b); return 0; } 结果如下: before swap:a = 10,b = 20 internal swap a = 20,b = 10 after swap:a = 10,b = 20 为什么呢?因为函数参数在传递的时候,都是 传原数据的副本** ,也就是说,swap内部使用的a和b只是最初始a和b的一个副本而已,所以无论在swap函数内部对a和b做任何改变,都不会影响初始的a和b的值。 正因如此,我们常常被告知,不要把直接把结构体直接作为参数

C语言:关于字符串操作感悟

折月煮酒 提交于 2019-12-15 19:37:31
由于C没有像C++或者Java或者。。。的各种花样繁多的字符串操作函数。而仅有屈指可数的几种函数: 函数名 功能 strlen(s1) 返回字符串s1长度, 而非这个变量占用空间的大小,那个是sizeof() ) strcpy(s1,s2) 复制字符串 s2 到字符串 s1 strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾 其他的函数先暂时用不到,用到再议。 现在要补充的是: (其他的想到会慢慢补充~0v0) 函数名 功能 p=add_char(str1,c) 在字符串s1末尾加字符c,返回结果的指针 p=add_str(str1,str2) 拼接字符串s1与s2,返回结果的指针 对于表1第一行的代码解释: # include <stdlib.h> # include <stdio.h> # include <string.h> int main ( ) { char a [ 10 ] = "123" ; printf ( "strlen:%d\n" , strlen ( a ) ) ; printf ( "sizeof:%d\n" , sizeof ( a ) ) ; system ( "pause" ) ; } 输出: 然后就来写一些替代函数啦~ 1.在字符串末尾添加字符 char * add_char ( char * s , char c ) {

scandir函数

Deadly 提交于 2019-12-15 19:30:54
在C语言课程的后端,讲完指针和标准文件IO处理,我会做出一个难度较大练习,题目就是, 利用标准的目录处理函数 opendir/readdir/closedir实现类似于 scandir的功能。其中接口要scandir 函数一致 。 这个题目看起来简单,实现难度相当大,主要采用复杂指针的操作。我第一次拿出来测试,全班大约只一二名实现80%的功能,其余很多觉得无从下手。程序很容易就会出现段错误。基本上短时间内正确的做出来的人可以划归专业级的程度了。有兴趣的人可以先不看后面内容,自行实现一下 首先看一下man的scandir 接口定义 int scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const struct dirent **, const struct dirent **)); ,从定义来看就不是一个简单的函数,形参里,出现一个三级指针,二个函数指针。它的功能是,扫描名字为dir的目录,把满足filter函数的过滤条件(即filter执行为非0值)的目录项加入到一维指针数组namelist.数组的总长度为返回值n,如果compar不为空,则最终输出结果还要调用qsort来对数组进行排序后再输出。 从scandir的演示代码

C语言:函数-递归

半世苍凉 提交于 2019-12-15 13:26:22
# include <stdio.h> int fn ( int num ) ; int main ( ) { int i , sum ; for ( i = 1 , sum = 0 ; i <= 100 ; i ++ ) { sum + = i ; } printf ( "sum=%d\r\n" , sum ) ; sum = fn ( 5 ) ; printf ( "sum=%d\r\n" , sum ) ; return 0 ; } int fn ( int num ) { if ( num == 1 ) { return 1 ; } return num + fn ( num - 1 ) ; } /* fn(1) = 1 fn(2) = 2 + fn(2 - 1) = 2 + fn(1) = 2 + 1 = 3 fn(3) = 3 + fn(3 - 1) = 3 + fn(2) = 3 + 2 + 1 = 6 fn(4) = 4 + fn(4 - 1) = 4 + fn(3) = 4 + 3 + 2 + 1 = 10 fn(100) = 100 + fn(100 - 1) = 100 + fn(99) = 100 + 99 ... 100 的 累加 相当于 100 加上 99 的 累加 */ 来源: CSDN 作者: hahahafree 链接: https://blog

C语言详解FILE文件操作

倾然丶 夕夏残阳落幕 提交于 2019-12-15 01:42:59
1. 需要了解的概念 需要理解的知识点包括:数据流、缓冲区、文件类型、文件存取方式 1.1 数据流: 指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。 1.2 缓冲区(Buffer): 指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。 C语言中带缓冲区的文件处理: C语言的文件处理功能依据系统是否设置“缓冲区”分为两种:一种是设置缓冲区,另一种是不设置缓冲区。由于不设置缓冲区的文件处理方式,必须使用较低级的I/O函数(包含在头文件io.h和fcntl.h中)来直接对磁盘存取,这种方式的存取速度慢,并且由于不是C的标准函数,跨平台操作时容易出问题。下面只介绍第一种处理方式,即设置缓冲区的文件处理方式: 当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据,如下图所示: 事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示。 1.3 文件类型: