c语言
- 标识符命名规则
①只能由字母、数字和下划线组成,且必须以英文字母或下划线开头。
②标识符有长度限制,超过的部分会被忽略,不同编译器长度限制不同
③关键字不能作为标识符。
c语言关键字(auto、break、case、char、const、continue、default、do、double、
else、enum、extern、float、for、goto、if、int、long、register、return、short、
signed、sizeof、static、struct、switch、typedef、union、unsigned、void、
volatile、while、inline、restrict、_Bool、_Complex、_Imaginary、_Alignas、
_Alignof、_Atomic、_Static_assert、_Noreturn、_Thread_local、_Generic)
main define scanf printf If不是标识符
2.标识符的存储类别
register:寄存器类型 寄存器变量存储在寄存器中,无法获取寄存器变量的地址
auto:自动存储类型 变量默认为auto类型,自动变量不会默认初始值
static :静态存储类型 从程序执行开始一直存在直到程序结束;全局变量(静态变量)默认初始值为0
extern:外部链接类型 在其他文件中已经声明的具有文件作用域的变量,本文件调用的话要用extern重新声明一下
关键字extern声明属于引用声明,extern声明不会引起内存分配,该变量必须在其他文件中有过定义声明(第1次声明)
3.格式化输出
常用
整型:%d、%o、%x/%X :十进制,八进制,十六进制小写/十六进制大写
实型:%f、%lf :单精度、双精度 (默认输出小数点后六位)
%m.nf:表示输出小数点后n位,总宽度为m,若数据宽度不足则用空格补齐,若数据宽度超出,整数位正常输出,小数位输出n位
字符型:%c、%s :单个字符、一个字符串
少见
%e: 科学计数法, 使用小写"e"
%E: 科学计数法, 使用大写"E"
%g: 使用%e或%f中较短的一个
%G: 使用%E或%f中较短的一个
%u: 无符号整数
%p: 一个指针
特殊使用:
%-d:输出整型时右对齐,+表示左对齐,默认左对齐
%0md:输出宽度为m的整型,如果数据不够,则用0补齐(当数据是左对齐时可以看到补的0,当数据时有对齐时,用空格替代了0)
%#f:当对应的数据没有小数点时,会自动加上小数点
%#x:输出的十六进制数据前会加上“0x”前缀
%#o:输出的八进制数据前会加上“0”前缀
4.运算符
初等运算符 > 单目运算符 > 算术运算符 > 关系运算符 >( && > ||)> 条件运算符 > 赋值运算符 > 逗号运算符
1.初级运算符:()、[]、->、.
2.算术运算符:+、-、*、/、%、++、--
3.关系运算符:==、!=、>、<、>=、<=
4.逻辑运算符:&&、||、!
5.赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
6.位运算符:&、|、^、~、<<、>>
7.其他运算符:字节数:sizeof()、下标:[]、逗号:,
5.math库常用函数
double exp( double arg ):返回e 的arg次幂
double fabs( double arg ):返回arg的绝对值
double fmod( double x, double y ):返回参数x/y的余数
double pow( double base, double exp ):返回以参数base 为底的exp 次幂
double sqrt( double num ):返回参数num的平方根
double exp( double arg ):返回参数e的arg次幂
double log( double num ):返回参数num的自然对数
double log10( double num ):返回参数num以10为底的对数
6.string库常用函数
size_t strlen( char *str ):返回字符串str 的长度
char *strncat( char *str1, const char *str2, size_t count ):将字符串from 中至多count个字符连接到字符串to中,追加空值结束符
int strncmp( const char *str1, const char *str2, size_t count ):比较字符串str1 和 str2中至多count个字符
char *strcpy( char *to, const char *from ):复制字符串from 中的字符到字符串to,包括空值结束符。返回值为指针to。
char *strncpy( char *to, const char *from, size_t count ):将字符串from 中至多count个字符复制到字符串to中。如果字符串from 的长度小于count,其余部分用'\0'填补
char *strchr( const char *str, int ch ):返回一个指向str 中ch 首次出现的位置,当没有在str 中找ch到返回NULL。
void *memcpy( void *to, const void *from, size_t count ):从from中复制count 个字符到to中,并返回to指针。
7.数组与指针结合实用
一维数组与指针
int arr[N];
对于指针指向一维数组这两种写法表示相同的意思:int *pa=arr; int *pa=&arr[0];
对于一维数组的输出以下是等价的:arr[i]==pa[i]==*(arr+i)==*(p+i)
二维数组与指针
int arr[N][M];
指针指向二维数组有以下写法:
①int (*pa)[N]=arr;
②int *pb=arr[K]; //此时的K代表二维数组的第几个元素
如果使用第①种方式指向数组,那么输出时一下是等价的:arr[i][i]==*(*(pa+i)+j)==*(pa[i]+j)==(*(pa+i)[j])
如果使用第②种方式指向数组,那么输出时应注意:*(pb+i*M*(int)sizeof(int)+j) //注意这里sizeof(二维数组存储的元素类型)
8.结构体与共同体
结构体的定义:
struct[结构类型名]
{
类型说明符 成员变量名;
…
类型说明符 成员变量名;
}[结构变量列表];
联合体的定义:
union[结构类型名]
{
类型说明符 成员变量名;
…
类型说明符 成员变量名;
}[结构变量列表];
结构体与联合体的区别:
①结构体中每个元素都可以存储数据,而联合体只有一个元素可以存储数据;
②结构体的大小是大于每个元素大小之和(根据每个元素的存储顺序,需要内存对齐),
联合体大小等于联合体中最大元素的大小的整数倍。
9.文件
向文件in.txt中写入字符串HelloWorld
#include<stdio.h>
int main() {
char str[]="HelloWorld";
FILE *pf=fopen("in.txt","w");
fprintf(pf,str);
fclose(pf);
return 0;
}
从文件a.txt中读取三个整数,然后把这三个整数保存到b.txt中,两整数之间一个空格
#include<stdio.h>
int main(){
int one,two,three;
FILE *a,*b;
a=fopen("a.txt","r");
b=fopen("b.txt","w");
int n=0;
while(n!=1)
{
fscanf(a,"%d%d%d",&one,&two,&three);
fprintf(b,"%d %d %d",one,two,three);
n++;
}
fclose(a);
fclose(b);
return 0;
}
读取a.txt中文本,统计文本中字母数量
#include<stdio.h>
int main(){
FILE *fp;
char word;
int num=0;
fp=fopen("a.txt","r");
while(!feof(fp))
{
fscanf(fp,"%c",&word);
if((word>='A'&&word<='Z')||(word>='a'&&word<='z'))
num++;
}
printf("%d",num-1);
fclose(fp);
return 0;
}