一、一维数组
字符数组:若干个字符组成的线性结构
字符串:是由0个或者多个单字符组成的串(以双引号括起来,有\0,所有汉字都是字符串)
字符数组是用来储存字符串,字符数组是容器,字符串是数据
1 单字符: 'a' ' ' '0'
2 字符串:"a" "" " " "你好" "0" "+-" "!@#$%^"
1.1字符数组的定义
格式:存储类型char 数组名[常量表达式];
存储类型:
auto:自动类型,一般默认不写的就是自动类型
static:静态类型,存储在静态区,延长生命周期
const:修饰词,表示变量的值不可修改
register:寄存器,访问速度快
extern:外部变量
volatile:防止内存优化
数据类型: char
数组名:命名规范
常量表达式:表示数组的个数[不为0,定义不为空,不为小数,初始化时不为变量]
int arr[0]
int arr[];
int arr[2.5];
int n=5;
int arr[n]={1,2,3,4,5};错误
1.2字符数组初始化
1>单字符初始化
char str[5]={ 'a','b','c','d','e'}; 全部初始化
char str[5]={'a','b','\0','\0','\0'}; 部分初始化,默认以'\0'或者0填充
char str[]={'a','b','c','\0'}; 省略数组长度, 默认是实际字符的个数
2>字符串赋值
char str[5]={"abcd" }等价char str[5]="abcd"; //计算 会默认为字符串填充\0
char str[5]="a"// 部分初始化,默认以'\0'或者0填充
char str[]="abc"; 等价 char str[4]="abc” 省略数组长度, 默认是实际字符的个数
3>错误
char str[10];
str="abc";
错误
char str[4]=" abcd" ;错误
1.3一维数组的引用
1>循环逐个引用
//strlen:计算字符串长度
2>整体引用
//字符串整体引用
//字符串的格式控制:%s
printf("%s\n",str);
3> scanf printf
char str[50];
printf("输入-一个字符串: ");
scanf("%s" ,str); //输入字符串不需要加&
printf("str=%s\n" ,str);
4> gets puts
格式char *gets(char *s);
返回:返回的是一一个字符串
参数:一个参数
头文件: #include <stdio.h>
格式: int puts(const char *s);
返回:返回输出字符串数组个数
头文件: #include <stdio.h>
参数:一个参数,可以是常量,也可以是变量5>scanf和gets
1. scanf不识别空格,认为空格是-个数据的结束,gets识别空格
2.scanf可以输入多个字符串,gets只可以输入一个字符串
3. scanf返回值输入参数的个数,gets返回字符串
4.scanf-般以空格、tab、回车结束,gets以回车结束
6> printf和puts
1. printf没有\n,puts自 带换行功能
2.printf可以输出多个变量,puts只可以输出一个
3. printf可以输出任意一种类型, puts只可以输出字符串
4. printf返回输出格式串的字符个数,puts返回 字符串的数组长度
1.4字符数组长度和字符串长度
字符串长度:不计算\0[strlen]【肉眼所见字符个数】
字符数组长度:计算\0【sizeof】
char a[5]={'a','b','c','d','\0'};字符串长度:4 数组长度:5
char a[3]={'a','b','c'};本质上不是一个字符串(没有\0或者“”)数组长度3
char a[10]="abc" 字符串长度:3数组长度:10
char a[]="abcd"字符串长度:4 数组长度:5
char a[]="ab\0cdef"字符串长度:2 数组长度:8
char a[]="ab\01cd"字符串长度:5 数组长度:6
1.5 字符串练习
1.5.1输入一个字符串【字符串存在空格】,实现字符串逆置
int i=0,j=strlen(str)-1
while(i<j){
char t=str[i];
str[i]=str[j];
str[j]=t;
i++;
j--;
}
1.5.2
实现每一个单词的逆置
"this is my class"————>"class my is this"
1>让整个字符串逆置
2>让每个单词再逆置
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
char str[50]="";
printf("请输入一个带空格的字符串:");
gets(str);
//整体逆置
int i=0,j=strlen(str)-1;
while(i<j){
char t=str[i];str[i]=str[j];str[j]=t;
i++;j--;
}
int t=0,i=0,j=0;
while(i<strlen(str)){
while(j!=' '&&j!='\0'){
j++;
}
t=j-1;
while(i<t){
char k=str[i];
str[i]=str[j];
str[j]=k;
i++;j--;
}
while(j==' '){
j++;
}
i=j;
}
printf("%s",str);
return 0;
}
22.字符串“this is my class",计算字符串"is”的个数
输出is出现2次
思路: .
is是一个整体, 假设单字符1”的下标使用循环变量i表示,则's'则可以看成是i+1
a[j]=='&& a[i+1]=='s'
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
char a[50]="";
printf("输入一个字符串");
gets(a);
int count=0;
for(int i=0;i<strlen(a);i++){
if(a[i]=='i'&&a[i+1]=='s')
count++;
}
printf("is出现的次数为:%d\n",count);
return 0;
}