C语言Tips

Tips

零. 写在前面

  1. 'a'(字符常量)和"a"有区别
  2. 调试时:监视里面输入(type()[number])begin
    type,类型
    number,查看数量
    begin,起始地址指针
  3. 函数可以改变数组的值,但是不能改变变量的值,只是表象:因为数组修改x[0]是自动就该地址了,相当于已经用过指针了。字符数组scanf不用&

一.关于输入Input,输出Output

Input

  • fflush(stdin); 清除输入缓冲区
  • scanf()函数按s格式符不能输入带空格的字符串,读%d或者%s时,读到空格、回车、制表符等空白字符,认为读入结束;
  • gets()函数可以处理带空格的字符串。
  • fgets(name,sizeof(name),stdin);限制输入字符串长度的函数
  • 区别:gets以回车符作为终止符,同时将回车符从输入缓冲区读走,但不作为字符串的一部分;而scanf()不读走回车符,回车符仍然留在输入缓冲区中。
  • 例:
char name[N];
scanf("%s",name);
get(name);
  • scanf("%d%d",&a,&b)!=EOF;
  1. 遇到这个表达式:scanf("%d%d",&a,&b)!=EOF;
    如果a和b都被成功读入,那么上面表达式的结果为2;
    如果只有一个读入,那么上面表达式的结果为1;
    如果a&&b都没有读入,那么上面表达式的结果为0(若a没有读入,则直接放弃b的读入);
    如果遇到错误或者文件结尾,那么上面表达式的结果为EOF,对应的有符号数时-1;
    如果遇到Crrl+Z,那么上面表达式的结果为EOF,对应的有符号数时-1;

  2. EOF在scanf连用时代表-1的意思,当用到while(scanf()!=EOF),
    代表的意思是一直输入,直到scanf返回的值是-1时才会停止输入,
    也可以在while里面加上一些约束条件,使输入在特定的条件下就会停止,
    也可以在输入完成后按下 ,Ctrl+z,可以强行停止输入。

Onput

puts()函数用于从括号内的参数给出的地址开始,依次输出储存单元中的字符,当遇到第一个'\0'时输出结束,并且自动输出一个换行符。

printf("name\n",name);
puts(name);

二.数组(Array)的定义 :一组具有相同类型的变量的集合。

一维数组:

int score[SIZE];

  • 其中"int"代表该 数组的基类型(Base Type)(数组中的元素的类型),"SIZE"下表的个数表明 数组的维数(Dimension)
  • 第一个元素为score[0], SIZE要么不写,要么是常量,不能是变量
  • 例如:
    int score[5] = {0,0,0,0,0};

二维数组:

dataType arrayName[length1][length2]; // 行数:length1 ,列数:length2

  • 第二维长度不能忽略。
  • 例如:
int matrix[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//等价 
int matrix[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int matrix[][4] = {{1,2,3},{4,5},{6}}; //等价 
int matrix[3][4] = {{1,2,3,0},{4,5,0,0},{6,0,0,0}};

三.字符串(Character string)

定义

char str[6] = {'H','e','l','l','o','\0'}; '\0'在字符串中也占内存,自动添加
char str[]= {"Hello"};  char str[] = "Hello";
char weekday[7(可省略)][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};\\长度为10,不足补'\0'

字符串处理函数

(1) strlen(str);字符串长度
由函数值返回字符串str的实际长度,不包括'\0'.
(2) strcpy(str1,str2);字符串复制
将字符串str2复制到字符数组str1中,这里确保str1大小足以容纳str2.
(3) strcmp(str1,str2);字符串比较
str1大于str2,返回值大于0;
str1等于str2,返回值等于0;
str1小于str2,返回值小于0;
按照ASCII码值从左到右比较。
(4) strcat(str1,str2)字符串连接
str2添加到str1末尾,函数调用后返回字符数组str1的首地址。(str1要定义的足够大)
(2)(3)(4)若写成(str1,str2,n)即对str2前n个字符进行操作。

四.结构体

定义

(1)先声明结构体,在定义结构体变量
struct 结构体名 结构体变量
struct 结构体名
{
数据类型 成员1名字
数据类型 成员2名字
};
或者如下定义
(2)struct 结构体名
{
数据类型 成员1名字
数据类型 成员2名字
}结构体变量;
(3)typedef struct student STUDENT;
STUDENT stu1,stu2;

结构体数组

STUDENT[30] = {{},{},{}}

五.其他数据类型

共用体

union
共用体是将逻辑相关,情形互斥的不同数据组织在一起形成的数据结构,每一时刻只有一个数据成员起作用。

枚举数据类型

enum response{no,yes,none};
enum response answer;

第一句声明了名为response的枚举类型,同时列出取值可能,第二句定义了response枚举型变量answer。

六.指针(Pointer)

取地址运算符(Address Operator),

  • 即&. (%p格式符,表示输出变量地址值),地址值是用一个十六进制(以16为基)的无符号整数表示,其字长一般与主机字长相同。
    例:
    printf("%d,%p",a,&a); //表示print出a的值和地址值。

指针的定义与初始化

  • 类型关键字 *指针变量名
  • 例:
int *pa;
pa = &a; //初始化指针变量pa,使其指向a
*pa = 2; //直接从地址上改变指向的值
  • 指针运算符也称为间接寻址运算符或者引用运算符即*,用来访问指针变量指向的变量的值。
    例: 函数指针直接改变传入参数的值
Swap(&x,&y);
void Swap(int *x,int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

函数指针

        void SelectionSort(int a[],int n,int (*compare)(int a,int b));
        int Ascending(int a,int b);
        int Descending(int a,int b);
        main()
        {
            SelectionSort(score,n,Ascending);
            SelectionSort(score,n,Descending);
        }
        void SelectionSort(int a[],int n,int (*compare)(int a,int b))//选择法排序
        {
            int i,j,k;
            for(i=0;i<n-1;i++)
            {
                k = i;
                for(j=i+1;j<n;j++)
                {
                    if((*compare)(a[j],a[k]))
                    {
                        k = j;
                    }
                }
                if(k!=i)
                {
                    Swap(&a[k],&a[i]);
                }
            }
        }
        int Ascending(int a,int b)
        {return a > b;}
        int Descending(int a,int b)
        {return a < b;}

七.文件操作

  • C语言文件类型有两种:文本文件(ASCII码文件),二进制文件

文件的打开与关闭

"r": 以只读方式,打开文本文件
"w": 以只写方式,创建并打开文本文件,已存在的文件将被覆盖
"a": 以只写方式,打开文本文件,位置指针移动到文件末尾,向文件尾部添加数据,原数据保留
"+": 与上面字符串组合,以读写方式打开文本文件,可写可读
"b": 与上面字符串组合,表示打开二进制文件
例:文件指针fp是指向FILE结构类型的指针变量
FILE *fp;
fp = fopen("D: \\demo.txt","a+"); //在demo文件中读写
fp == NULL; 判断是否读取成功

读写文件中的字符

fputs(char,fp): 用于将一个字符写到一个文件上。
feof(fp): 用于检查是否到达文件末尾,当文件位置指针指向文件结束符时。返回非0值,否则返回0值。
fgets(char *s,n,fp): 用于从一个以只读或读写方式打开的文件上读字符。读取字符串并在末尾添加'
0',然后存入s,最多读n-1个字符
posted @   snowyn  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示