C学习记录4——数组和字符串
一、数组
1.数组
为方便处理数据把具有相同类型的若干变量按有序形式组织起来。
有序形式:在内存中连续的相同类型的变量空间
形式为:
数据类型 数组名[元素个数]={值1,值2,……}
int arr[10];
2.数组名与下标
数组名[下标]
arr[1]
数组名是一个指向数组首地址的常量,数组元素必须为常量、常量表达式。
数组在内存中占的大小 = 数据类型 * 元素个数
3.数组逆置
int arr[10]={1,2,……,10}; //元素数10可不写
int i = 0;
int j = sizeof(arr)/sizeof(arr[0])-1;
while (i<j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
for (int i=0;i<10;i++)
printf("%d\n",arr[10])
二、二维数组
1.定义形式
类型说明符 数组名[常量表达式1][常量表达式2]
1:第一维下标长度(行) 2:第二维下标长度(列)
int arr[2][3]=
{
{1,2,3},
{4,5,6}
};
或
int arr[2][3]={ {1,2,3},{4,5,6}};
int arr[][3]={ 1,2,3,4,5,6,7}; //只有第一个数可省略
//允许此形式,有列可自动补行数,不足补0。
三、多维数组
如三维数组:
数据类型 数组名[层][行][列]
几维数组输出就需几层循环
for (int i=0;i<2;i++)
{
for (int j=0;j<2;j++)
{
for (int k=0;k<2;k++)
{
printf("%d\t",arr[i][j][k];
}
printf("\n");
}
}
四、字符数组和字符串
1.定义字符数组
数组中元素为字符
char arr[5] = {'h','e','l','l','o'};
2.字符串
带\0结尾的字符数组(C语言中无字符串类型)
定义为:char * arr = "hello";
等同于char arr[] = "hello";
等同于char arr[] = {'h','e','l','l','o','\0'};
等同于char arr[6] = {'h','e','l','l','o'};
补0,到0即停止
3.定义字符数组储存字符串
char ch=[10]; //只能存入9个字符,结尾有\0.
scanf("%s",ch); //ch(数组)本身有地址,不用&。 %9s可保留9位
printf("%s",ch);
4.拼接字符串
char ch1[]="hello";
char ch2[]="world";
char ch2[20];
int i=0,j=0;
while (ch1[i] != '\0')
{
ch3[i]=ch1[i];
i++;
}
while (ch2[i]!= 0) // '\0' = 0
{
ch3[i+j]=ch2[j];
j++;
}
ch3[i+j] = 0;
5.字符串数组
char arr[][6]={"hello","world"};
{ }可不写
五、字符串的输入输出
在<string.h>头文件中
1.gets()
从标准输入读入字符串,保存到指定内存空间,直到出现换行符或文件结尾,失败返回NULL
gets(str);
gets允许输入字符串有空格,scanf("%s",str)不允许有空格
PS:可通过正则表达式([^\n]接收非\n字符)
scanf("%[^\n]",str)
可接收空格
gets()与scanf()不知字符串大小,遇换行符、结尾才接收输入,所以易越界,不安全。
2.fgets()
从stream指定的文件内读入字符,保存到指定内存空间,直到出现换行符,文件结尾或已读size-1个字符,最后自动加’\0’结束。
fgets(str,int size,stream);
size:指定最大读取长度size-1
stream:文件指针,如果读键盘输入的字符串,固定写stdin
fgets(str,sizeof(str),stdin);
fgets()读取键盘输入的字符串时,把回车作为字符串的一部分,通过fgets结尾多了"\n",因此安全,不存在缓冲区溢出。
fgets()获取字符串少于元素个数会有\n,大于等于则无。
3.puts()
输出字符串(可空格),输出完成后自动输出一个’\n’,成功返回非负数,错误返回-1.
puts("");
换行
4.fputs()
将指定字符串写入stream指定文件中字符串结束符"\0"不写入文件。
字符串输出到屏幕,固定写stdout
fputs(str,stdout);
5.strlen()
计算指定字符串长度,不包含’\0’
五、其他字符串处理函数
1.strcpy()
strcpy(char* dest, str);
把str指向的字符串复制至dest所指的空间中(包括’\0’)
dest:目的字符串首地址
str:源字符串首地址
2.strncpy()
strncpy(dest, stc, n);
把stc指向的前n个字符串复制(不一定包含’\0’)
3.strcat()、strcat()
语法同上
将src字符串连到dest尾部
将src字符串的前n个字符连到dest尾部
会追加’\0’(比strcpy多了找到字符串末尾的0)