数组运算、字符、字符串
数组运算
数组的集成初始化和定位
//集成初始化
int a[] = {1,2,6,4,3,8,12,34};
//集成初始化的定位
int b[10] = {
[0] = 2, [2] = 3,6,
};
- 用n在初始化中给出定位
- 没有定位的数据接在前面的数据位置的后面
- 其他的位置的值补零
- 没有n的时候让编译器自己数
- 特别适合比较稀疏的数组
数组的大小和赋值
- sizeof给出整个数组内容所占的大小,单位是字节:sizeof(a)/sizeof(a[0])
- sizeof(a[0])是数组中单个元素的大小,于是相除就得到了数组元素的个数
- 数组变量本身不能被赋值
- 想要进行数组的赋值只能通过遍历的方式
选择排序
数组实现选择排序
#include <stdio.h>
int max(int a[], int n)
{
int mid = 0;
for(int i = 1; i < n; i++)
{
if(a[i] > a[mid])
{
mid = i;
}
}
return mid;
}
int main()
{
int n;
scanf("%d", &n);
int a[n];
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int len = sizeof(a)/sizeof(a[0]);
for(int j = len-1; j > 0; j--)
{
int maxid = max(a, j+1);
int t = a[maxid];
a[maxid] = a[j];
a[j] = t;
}
for(int m = 0; m < len; m++)
{
printf("%d ", a[m]);
}
return 0;
};
字符
char是一种整数,也是一种特殊的类型:字符
用单引号表示字符:‘a’,‘2’
printf和scanf中用%c来输入输出字符
a = 1;
scanf("%c",&a); //a = 1
scanf("%d",&a) //a = 49
- '1’的ASCll表中编码是49,所以a == 49也表示a=‘1’;
逃逸字符
字符 | 意义 | 字符 | 意义 |
---|---|---|---|
\b | 回退一格 | " | 双引号 |
\t | 到下一个表格位 | ’ | 单引号 |
\n | 换行 | |反斜杠本身 | |
\r | 回车 |
字符串
- 以0(整数0)为结尾的一串字符
- 0和’\0’是一样的但是和’0’不同
- 0表示字符串结束的标志,但不是字符串的一部分
- 计算字符串长度的时候不包括这个0
- 字符串以数组的形式存在,以数组或指针的方式访问
字符串变量
//字符串变量
char *str = "hello";
char str[] = "hello";
char str[10] = "hello";
- C语言的字符串是以数组的形式存在的
- 不能用运算符对字符串进行操作
- 可以用数组的方式对字符串进行遍历
字符串常量
char *s = "hello world";
- s是一个指针,初始化指向一个字符串常量
- 实际上char *s == const char *s;
- 如果需要修改字符串应该用:char s[]=“hello world”;
常见的字符串函数
- strlen
求字符串长度
//原型
size_t strlen(const char *s);
//返回值
返回s的字符串长度(不包括结尾的0);
例:
int a = "hello";
strlen(a) = 5;
sizeof(a) = 6;
- strcmp
比较两个字符串
//原型
int strcmp(const char *s1,const char *s2);
//返回值
0:s1 == s2
1:s1 > s2
-1:s1 < s2
- strcpy
把src字符串拷贝到dst
//原型
char* strcpy(char *restrict dst,const char *restrict src);
//返回值
返回dst