数据与输入
数据
ISO C规定int取值上限为32767.
声明:int a,b,c; int a=12,b=4;
糟糕的格式:int dogs,cats=12;
只初始化了cats,但容易带来误解
整数是指不含小数点和指数的整数. 22.01, 2.2E3都不是整数,前缀0表示八进制,前缀0x表示十六进制,一般一个int占用一个字长.%#o
带0表示符号的八进制
long long
占用64位,long
占32位,short
占用16位,int
一般和long
相同. 一般来说我们首先考虑unsigned int
在C99 和 C11 提供 %zd
转换说明匹配sizeof
的返回类型。
float
----> 单精度浮点型,系统的基本浮点类型,可精确到至少6位有效数字
double
----> 双精度浮点型,存储范围更大,能表示至少10位有效数字和更大的指数。
字符串和格式化输入/输出
string.h
库变量:size_t
新标准使用%zd
返回sizeof()和strlen()
的类型
库宏: NULL
库函数:void *memchr(const void *str, int c, size_t n)在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
strstr(a,b)
查找字符串a中的b首次出现的位置
strlen()
strcmp()
和strncmp()
memcmp(const void *str,const void *str2,size_t n)
strcpy()
和strncpy()
strcat()
strncat()
将b(前n个字符)连接到n尾部
int sprintf(char *str,const char *format,..)
根据format字符串来转化格式化数据,返回实际格式化的字符个数
#include <stdio.h>
int main(){
char dst[100] = { 0 };
int a = 10;
char src[] = "hello world";
sprintf(dst, "a = %d, src = %s", a, src);
printf("dst = \" %s\"\n", dst);
return 0;
}
输出dst = " a = 10, src = hello world"
sscanf()
char src[] = "a=10, b=20";
int a;
int b;
sscanf(src, "a=%d, b=%d", &a, &b);
printf("a:%d, b:%d\n", a, b);
strchr(str,X)
在str中查找字母字符的位置(弱化版strstr)
char *strtok(char *str, const char *delim)
将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。
在第一次调用时:strtok()必需给予参数 s 字符串,往后的调用则将参数 s 设置成 NULL,每次调用成功则返回指向被分割出片段的指针
char a[100] = "adc*fvcv*ebcy*hghbdfg*casdert";
char *s = strtok(a, "*"); //将"*"分割的子串取出
while (s != NULL)
{
printf("%s\n", s);
s = strtok(**NULL**, "*");
}
atoi() atof() atol().....
const
C90标准增加const关键字
。用于限定一个变量为只读
把const数据或非const 数据的地址初始化为指向 const的指针或为其赋值是合法的∶
const指针可以指向普通变量和const变量,而普通指针只能指向普通变量。如此看来,函数中的const指针标识既可以给一个const也可以给一个非const,非const备份副本后会将其初始化为一个const.
double rates[5] = {88.99, 100.12, 59.45, 183.1, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
const double *pc = rates; //有效
pc = locked;
pc = &rates[3];
const double PI 3.1415926
#define PI 3.1415926 宏定义是把代码中的PI换成3.1415926,而const是创建一个不可修改
的变量
C预处理器是非常有用的工具
const的用法可以更灵活
double * const p
表示指针不可指向别处(const在后面,也即(const p)) 可做*p=26
double const *p
和const double *p
表示指针所指不能被修改(const(*p)) 可做p=&b
double const * const p
和const double * const p
表示都不能被修改
p计数法即十六进制浮点计数法
C99规定,可以初始化列表中使用带方括号的下标指明待初始化的元素。
对于一般的初始化,在初始化一个元素后,末初始化的元素的都会被设置为 0 。
⚠️注意:在使用数组时,要防止数组下标超出边界。必须确保下标是有效的值
。
int arr[6] = {[5] = 2}
; // 把arr[5] 初始化为2
字符输入输出
C程序处理的是流而不是直接处理文件。**流(stream)**是一个实际输入或输出映射的理想化数据流。这意味着不同属性和不同种类的输入,由属性更统一的流来表示。于是,打开文件的过程就是把流与文件相关联,而且读写都通过流来完成。
strlen()函数