【笔记】C语言数组与字符串

前言

C语言数组与字符串学习笔记

数组的特点

  • 数组下标从0开始
  • 数组所有成员在内存中是连续的
  • 数组所有成员的数据类型相同
  • 数组名在C语言中实际上是数组第一个元素的地址常量

一维数组

定义数组

  • 定义数组时直接定义数组长度
1
数据类型 变量名[数组长度];

数组初始化

1
数据类型 变量名[数组长度] = { 数据, 数据, ... };
  • 这种情况下如果数据的长度没有达到数组长度,其他后续的下标位置的元素都为默认值(int类型的默认值为0)

初始化为默认值

1
int 变量名[数组长度] = { 0 };

通过数据定义长度

  • 这是一种省略的写法,编译器在编译时会加上数组长度
1
数据类型 变量名[] = { 数据, 数据, ... };

修改数组的数据

  • 修改数组指定下标的数据
1
变量名[下标] = 数据;

遍历数组

sizeof(数组名):数组整体大小
sizeof(数组名[0]):数组一个成员的大小
sizeof(数组名)/sizeof(数组名[0]):数组成员个数

1
2
3
4
5
int i;
for (i = 0; i < sizeof(数组名)/sizeof(数组名[0]); i++)
{
...
}

二维数组

定义数组

1
数据类型 变量名[数组长度][数组长度];

数组初始化

1
数据类型 变量名[数组长度][数组长度] = { { 数据, 数据, ... }, { 数据, 数据, ... }, ... };
  • 这种情况下如果数据的长度没有达到数组长度,其他后续的下标位置的元素都为默认值(int类型的默认值
    为0

初始化为默认值

1
int 变量名[数组长度][数组长度] = { 0 };

通过数据定义长度

  • 这是一种省略的写法,编译器在编译时会加上数组长度
1
数据类型 变量名[][数组长度] = { { 数据, 数据, ... }, { 数据, 数据, ... }, ... };

修改数组数据

1
变量名[数组下标][数组下标] = 数据;

遍历数组

1
2
3
4
5
6
7
8
int i, j;
for (i = 0; i < sizeof(数组名)/sizeof(数组名[0]); i++)
{
for (j = 0; j < sizeof(数组名[0])/sizeof(数组名[0][0]); j++)
{
...
}
}

多维数组

  • 以此类推

字符数组与字符串

定义一个字符数组

1
char 变量名[数组长度];

字符数组初始化

  • 最后一个字符需要是'\0'0才可以组成字符串
1
2
3
char 变量名[数组长度] = { '', '', ..., '\0' };

char 变量名[数组长度] = { '', '', ..., 0 };

省略最后一位

  • 省略最后一位默认为0
1
char 变量名[数组长度] = { '', '', ... };

定义字符串

  • 实际上是简化字符数组的初始化
1
char 变量名[数组长度] = "";

初始化为默认值

1
char 变量名[数组长度] = { 0 };

输入一个字符串

  • 从控制台输入一个字符串

scanf 函数

  • scanf函数会认为空格和回车都是结束符
  • 如果输入超出字符串长度,会报错
  • 结尾不会自动换行
1
2
char 变量名[数组长度] = { 0 };
scanf("%s", 变量名);

gets函数

  • gets函数只会认为回车是结束符
  • 如果输入超出字符串长度,会报错
1
2
char 变量名[数组长度] = { 0 };
gets(变量名);
fgets 函数
  • fgets改进了gets
  • fgets函数只认为回车是结束符,同时这个换行符也作为输入存进了字符串
  • 如果输入超出字符串长度,不会报错
  • 结尾会换行,因为有换行符
1
2
char 变量名[数组长度] = { 0 };
fgets(变量名, sizeof(变量名), stdin);

输出一个字符串

printf 函数

  • 结尾不会自动换行

<str>:字符串变量

1
printf("%s", <str>);

puts 函数

  • puts只能输出字符串
  • 结尾会自动换行
1
puts(<str>);
fputs 函数
  • 结尾不会自动换行
1
fputs(<str>, stdout);

完成