命令行参数tail c语言,C语言基础

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

二维数组的定义

类型 数组名[常量表达式1][常量表达式2];

例如:float a[2][3];

二维数组的引用

数组名[行下标][列下标];

二维数组的初始化

1、分行初始化1

2

3

4

5int a[3][4] = {

{1,2,3,4},

{5,6,7,8},

{9,10,11,12}

};

2、按顺序初始化1int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

3、部分元素初始化1

2

3

4

5int a[3][4] = {

{ ,1},

{0,6},

{0,0,11}

};

1

2

30 1 0 0

0 6 0 0

0 0 11 0

4、如果对全部元素赋值,定义数组可以不指定一维长度1int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

二维数组的输入与输出

二维数组的输入与输出是通过对每个元素的输入输出实现的。

1、输入方法1

2

3for(int i = 0; i < 2; i++)

for(int j = 0; j < 3; j++)

scanf("%d",&a[i][j]);

2、输出方法1

2

3for(int i = 0; i < 2; i++)

for(int j = 0; j < 3; j++)

printf("%d",a[i][j]);

指向二维数组的指针

二维数组可以堪称时由多个一维数组的组合。

比如:对于int a[3][4];

(1)a是数组名,包含三个元素,a[0],a[1],a[2]。

(2)每个元素a[i]又是一个一维数组,包含4个元素。

二维数组的行指针与列指针例子类型意义a行指针类型二维数组的首地址,第0行的地址

a+i行指针类型第i行的地址

*(a+i)列指针类型第i行第0列的地址

*(a+i)+j列指针类型第i行第j列的地址

((a+i)+j)元素第i行第j列的元素

指针与二维数组

1、列指针1

2

3

4

5

6

7

8int *p;

int a[3][4];

p = a[0]; //用列地址初始化

int i,j;

for(i = 0; i < iMAX; i++)

for(j = 0; j < jMAX; j++)

printf("%d",*(p+i*n+j)); //或p[i*n+j]

2、行指针1

2

3

4

5

6

7int (*p)[3]; //行指针,指向数组的一行

p = a; //用行指针初始化

int i,j;

for(i = 0; i < iMAX; i++)

for(j = 0; j < jMAX; j++)

printf("%d",*(*(p+i)+j)); //可以写成p[i][j]

特殊的指针:数组类型指针

例如:int (*iPtr)[3];

类型名:”int”说明其指向的数组变量类型是整型。

数组类型指针变量名:”iPtr”说明要定义的变量名字。

整型常量表达式:”3”说明指向的数组变量元素个数为3。

指针数组

元素均为指针类型数据的数组,称为指针数组

定义形式:类型关键字 *数组名[数组长度];

例如:char *pStr[5];1

2

3

4

5

6

7

8//二维字符数组

void main(){

int i;

char str[][10] = {"Pascal","Basic","Fortran","Java","VisualC"};

for(i = 0; i < 5; i++)

printf("%sn",str[i]);

}1

2

3

4

5

6

7

8//字符指针数组

void main(){

int i;

char *ptr[] = {"Pascal","Basic","Fortran","Java","VisualC"};

for(i = 0; i < 5; i++)

printf("%sn",ptr[i]);

}

命令行参数

int main(int argc, char* argv[])

动态分配内存1

2

3

4

5

6

7

8

9

10

11

12

13

14#include

void* malloc(unsigned int size);

//向系统申请大小为size的内存块,返回首地址。申请不成功返回NULL。

void* calloc(unsigned int num, unsigned int size);

//向系统申请num个size大小的内存块,返回首地址。申请不成功返回NULL。

void free(void* p);

//释放由malloc和calloc申请的内存块。p是指针。

//例如:if(p == NULL){free(p); p = NULL}

void* realloc(void* pointer, unsigned int size);

//如果重新分配成功,返回指向被分配内存的指针,否则返回空指针NULL。

结构体

结构体的定义

一般形式:1

2

3

4

5struct 结构体名{

类型关键字 成员名1;

类型关键字 成员名2;

类型关键字 成员名3;

};

例如:1

2

3

4

5struct student{

int ID;

char name[20];

int age;

};

结构体只是定义了数据的形式,未生成任何变量,可以如下定义:struct student stu;。

定义类型名1

2

3

4

5typedef struct student{

int ID;

char name[20];

int age;

}STUD;

或直接typedef struct student STUD;。

定义的类型名就与普通数据形式一样的使用方法。

链表

类型:1

2

3

4

5struct student{

int ID;

struct student* next;

};

typedef struct student Node;

尾插法创建链表

基本思路:

1、申请一个节点的空间,置指针域为空。

2、输入结点数据域的数据。

3、搜索链表的最后一个结点。

4、将新结点插入到链表尾。

5、返回头指针。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25Node* Add_end(Node* head){

Node *p;

Node *tail;

p = (Node*)malloc(sizeof(Node));

if(NULL == p){

printf("Wrong!");

exit(1);

}

p->next = NULL;

scanf("%d",&(p->ID) ); //一个结点创建完毕。

if(NULL == head){

head = p;

}

else{

tail = head;

while(tail->next != NULL){

tail = tail->next;

} //找到尾节点

tail->next = p; //插入

}

return head; //返回

}

头插法创建链表

基本思路:

1、建立空链表,但不需要定义尾指针。

2、生成新结点,对新结点赋值,指针域可不必赋值。

3、将结点插入到链表中。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16Node* Add_head(Node* head){

Node* p;

p = (Node*)malloc(sizeof(Node));

if(NULL == p){

printf("Wrong!");

exit(1);

}

p->next = NULL;

scanf("%d",&(p->ID)); //单个结点创建完成

p->next = head;

head = p; //插入完成

return head;

}

文件操作

打开文件fopen

常用的打开文件方法:1

2

3

4if( (fp = fopen("文件名","操作方式")) == NULL ){

printf("打不开文件n");

exit(1);

}

文件操作方式:文件操作方式含义r(只读)为输入打开一个文本文件

w(只写)为输出打开一个文本文件

a(追加)向文本文件尾增加数据

rb(只读)为输入打开一个二进制文件

wb(只写)为输出打开一个二进制文件

ab(追加)向二进制文件尾增加数据

r+(读写)为读/写打开一个文本文件

w+(读写)为读/写建立一个新的文本文件

a+(读写)为读/写打开一个文本文件

rb+(读写)为读/写打开一个二进制文件

wb+(读写)为读/写建立一个新的二进制文件

ab+(读写)为读/写打开一个二进制文件

规律:

1、含有”b”的为二进制文件操作。

2、含有”+”的可以进行读写操作,且可以新建文件。

文件关闭fclose

函数原型:int fclose(FILE *fp);

功能:关闭fp所指向的文件。

正常关闭返回0,出错返回非0值。

读/写文件中的一个字符

写入一个字符到文件中——fputc

函数原型:int fputc(int c, FILE *fp);

功能:把一字节代码c写入fp指向的文件中,同时读写位置指针指向下一个写入位置。

返回值:正常,返回c(ASCLL码);错误返回EOF。

从文件中读取一个字符——fgetc

函数原型:int fgetc(FILE *fp)

功能:从fp指向的文件中读取一字节代码。

返回值:正常,返回读到的代码值;读到文件为或出错,返回EOF。

库函数feof

函数原型:int feof(FILE *fp)

功能:执行读文件操作时,遇到文件尾,返回逻辑真;否则返回0。

读/写一个字符串

读一个字符串——fgets

函数原型:char *fgets(char *s, int n, FILE *fp)

功能:从fp所指向文件读n-1个字符送股s指向的内存区,并在最后加一个’ ’。

返回值:正常时返回读取字符串的首地址;出错或遇文件尾返回NULL。

写一个字符串——fputs

函数原型:int fputs(char *s, FILE *fp)

功能:把s指向的字符串写入fp指向的文件。

返回值:正常时返回写入的最后一个字符;出错为EOF。

读/写一个数据块

读一个数据块——fread

函数原型:int fread(void *buffer, int size, int count, FILE *fp)

功能:从fp所指向的文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;同时,将读写位置指针移动size*count个字节。

返回值:调用成功,返回count;否则为0。

注意:一般用于二进制文件的处理。

写一个数据块——fwrite

函数原型:int fwrite(void buffer, int size, int count, FILE *fp)

功能:从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中;同时将读写文件位置指针移动size*count个字节。

返回值:调用成功,返回count;否则为0。

注意:一般用于二进制文件的处理。

对文件进行格式化读写

函数原型:

1、读入:int fscanf(FILE *fp,const char*format,[argument,···])

2、写出:int fprintf(FILE *fp,const char*format,[argument,···])

功能:按格式对文件进行I/O操作。

返回值:成功,返回I/O的个数;出错或文件尾,返回EOF。

位置指针和文件定位

位置指针复位函数——rewind

函数原型:void rewind(FILE *fp)

功能:使文件的位置指针返回到文件头。

移动文件位置指针函数fseek

函数原型:int fseek(FILE *fp, long int offset, int whence)

功能:将指定文件的位置指针,从参照点开始,移动指定的字节数。

参照点:’0’或SEEK_SET表示文件头,’1’或SEEK_CUR表示当前位置,’2’或SEEK_END表示文件尾。

返回值:成功为0;否则为非0值。

注意:一般用于二进制文件处理。

返回文件当前位置的函数ftell

函数原型:long int ftell(FILE *fp)

功能:返回文件位置指针的当前位置(用相对于文件头的位移量表示)。如果返回值为-1L表明调用出错。1

2

3offset = ftell(fp);

if(offset == -1L)

printf("ftell() errorn");

出错检测

ferror函数

函数原型:int ferror(FILE *fp)

功能:如果返回值为0,表示未出错;返回非0值,表示出错。

注意:

(1)对同一文件,每次调用输入输出函数均产生新的ferror()函数值。因此调用的输入输出函数后,应立即检测,否则出错信息会丢失。

(2)在执行fopen函数时,系统将ferror的值设为0。

clearerr函数

函数原型:void clearerr(FILE *fp)

功能:将文件错误标志(ferror的值)和文件结束标志(feof的值)置为0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值