<C> 数组02 - 2017/11/18
数组 --> 数组定义
如:
类型 数组名[数组大小 ]
char arr[12]; // 定义数组 < arr array>
// 字符数组
%s 用于字符数组
char数组 --> 存的是单个字符
"hello" 双引号括起来的 叫做字符串 后面有一个 \0
字符串是用字符数组存储的
如果字符数组中没有 \0 那么不能使用字符串函数 %s
%s --> 打印后面的所有字符直到遇到 \0
字符数组是唯一一个可以直接赋值的数组
比如:gets scanf
1.字符数组和普通数组的区别和联系:
普通数组 --> 循环单个单个给元素赋值 后面没有 \0
字符赋值 --> 用函数整体赋值 后面一定有 \0
2. '\0'字符 结束标记 --> 只占一位
scanf 或者 gets 一定会有
char arr[5] = {'H','e','l','l','o'}; // 长度够也会有(留位置给\0)\
如果单个字符单个字符赋值进来 --> 记得手动添加 \0
3.scanf遇到空格会结束字符串的输入
gest 遇到空格也不会结束输入
--> 如果输入的字符串中有空格 -> 记得用 gest 函数 --> 回车结束输入
4.字符数组的操作:
赋值 --> 直接赋值
char arr[10] = "hello"; // 如果字符数组 -> 大小没写 会根据赋值时候的长度来确定 char arr[] = ""; // 这样赋值长度为:1
用函数赋值 -> scanf("%s",arr); // 不需要加取地址
printf("%s",arr); scanf_s("%s",arr,10);
gets/gets_s --> 输出字符串 : puts(arr);
strlen()函数在: string.h文件中
长度测量: strlen(arr) 遇到 \0 之前的字符个数(不算:\0)
如果测量素组的大小 sizeof(arr)/sizeof(arr[0]) // 数组总字节/单个元素字节得到数组大小(一般不会用来计算字符数组长度)
char arr[10] = "hello"; sizeof(arr)/sizeof(arr[0]); 得到结果是10 strlen(arr) 得到结果5
// sizeof(arr) 字符数组占用的空间 =字符数组大小*sizeof(char)
字符串比较函数 --> string.h // 不能使用 == 比较
strcmp(字符串1,字符串2) == 0 两个字符串是一样的 返回值是一样的
char arr[] = "hello\0wor\'ld"; char brr[10] = "hello"; if (strcmp(arr, brr) == 0) { printf_s("%]两个字符串是一样的"); }
拷贝函数:strcpy(字符串1,字符串2) 把字符串2的内容拷贝到字符串1里面
如果字符串1有内容 会覆盖掉之前的内容
连接函数:strcat(字符串1,字符串2) 字符串2的内容拷贝到字符串1的后面
连接之后 字符串1可能越界 所以连接的时候要注意一下字符串1的大小
PS:a)
旧版函数和新版函数
scanf_ gets_s _s safer更安全
b) 输入的时候 \0 存的时候\\0
输入的时候 \ 存的字符 '\\'
代码书写的时候 '\\' 存ASCII '\n'
c) 数组大小:数组能够存放的元素的最大个数(超出了就越界)
字符串长度 字符串\0前的元素个数
d) 转义字符 --> 代码 字符串中表示某些字符
'\t' 只算一个字符
输入的时候 "hello\""
\+ 其他字符
\t 制表符
\n
\a
\\
\0
\'
\"
输入的时候 \0 --> \
'\\' --> \
存放 --> 存放ASCII码
在代码中表示 转义
代码块:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { #if 0 char arr[5] = { 'H', 'e', 'l', 'l', 'o' }; // 数组长度是:10 不足赋值:0 //char arr[10] = { "Hello" }; // Hello 后面有一个 \0 也算长度 {}可以不要 // ASCII 0 对应的字符 '\0' 字符串的结束符号 也占用一个字符长度 // '\0' 前面的是有效字符 arr[1] = '2'; // 直接给数组元素赋值 //scanf_s("%s", arr); // 字符数组名 不需要取地址 (遇到空格会结束) //gets(arr); // 填数组名 gets_s(arr,10); // 10 数组最多能接受字符的个数 --> 实际上只能输入9个 getchar(); printf_s("%s\n", arr); // 用循环打印 /*for (int i = 0; i < 5; i++) { printf_s("%c", arr[i]); } */ #elif 0 char arr[] = "hello\\world"; // arr大小 strlen 打印 puts(arr); printf_s("%d", strlen(arr)); #elif 1 char arr[] = "hello\0wor\'ld"; //char crr[] = "hel\"lo"; // 表示输出时是:hel"lo char crr[10]; strcpy_s(crr, arr); // 拷贝 //strcat_s(crr, arr); // 连接 puts(crr); char brr[10] = "hello"; if (strcmp(arr, brr) == 0) { printf_s("两个字符串是一样的"); } printf_s("%s\n", crr); #endif getchar(); return 0; }