C语言的 字符串 与 数组
#include <stdio.h>#include <string.h>
/*
1.将用户名和密码 以字符串的 形式来实现
*/
int main(void){
// char name; // 利用字符串数组名 保存字符串
// char pwd;
// printf("请输入用户名:");
// scanf("%s",name); // 这里 不需要加入 & 号【原因 &name 表示的是变量name的地址, 而 name 本身就是地址】
// printf("请输入密码:");
// scanf("%s",pwd); // 注意了 这里是 s%
// printf("您输入的用户名为:%s ; 您输入的密码是 %s\n", name, pwd);
// int a[] = {2,4,7,8,6};
// 这个计算 是利用内存, 且 数组的元素类型相同(内存相同), 计算出 数组中元素的个数
// printf("数组占了 %d 个字节,一共有 %d 个元素", sizeof(a), sizeof(a)/sizeof(a));
// 怎么合理的控制字符长度
// char name[] = "laomo";//这样会自动设置name长度 为 6 【为什么是6呢,因为字符串结束符也占一个字节 \0】
// 再添加一个坑爹的字符串截取方式
// name = 0; // 相当于字符串结束符 '\0' 后面如果打印 就打印出来 lao就这么坑
// 使用 gets 输入字符
// char name;
// gets(name);
// printf("胖爷输入的是:%s",name);
// 使用 fgets 输入字符
// char name;
// fgets(name,8,stdin); // 参数:数组名 , 长度, 标准输入设备【长度是8,最多读7个】// 也可以 fgets(name,sizeof(name),stdin);
// printf("胖爷输入的是:[%s]\n",name);// 有可能 回车符被读取了【输入数据 比 指定长度小】
// 计算字符串的长度,strlen
// char name[] = "laomo";
// printf("name的长度是:%d",strlen(name));//len = 5恕我直言 这居然不包括 字符串结束符
// 字符串的拷贝strcpy 特点:把原字符串的结束符 也拷贝到新字符串中
// char name;
// char key;
// printf("请输入一个字符串:");
// scanf("%s",&name);
// strcpy(key,name); // 把 字符串name 拷贝到 字符串key 中
// printf("key=%s",key);
// char t = name; // 这样写是不对的
// printf("t的值是%s",t);
// 字符串的拼接接 strcat
char k; // lao
char b; // mo
printf("请输入一个字符串:");
gets(k);
printf("请再输入一个字符串:");
gets(b);
// strcat(k,b); 得出结论 拼接字符串后,原字符串已经更改掉了
printf("拼接出来的字符串是:%s\n",strcat(k,b)); // laomo
// 这个时候打印
printf("此时k为:%s\n",k); // laomo
printf("此时b为:%s\n",b); // mo
return 0;
}
/*
字符串的讲解:
1.本质 字符串就是0个或者多个“字符”组成的有序序列 ;
2. 字符串长度字符串包含的字符个数 ;
3. 字符串结束符
在C语言中,为了便于存储字符串,要求在最后一个字符的后面存储一个0(一个字节)。
这个0,称为“字符串结束符”,常用“ ”表示;
4.字符串常量
字符串常量,要求用"" 扩起来。%s 用来匹配字符串 ;必须是双引号
5.字符串的存储
在C语言中,字符串是以“字符数组”存储的。
6.字符串的输入
scanf("%s", name);//数组名 与普通变量不同,它本身就表示一个地址;
// scanf 输入时,遇到空格,就以为输入完了 很是尴尬 所以就有了以下几个
7.使用 gets 输入字符【 不读取回车符与换行符 】
特点: 1.能够读取 空格、制表符,但是不读取回车符 ; 2. 使用方便
缺点: 2.超过长度没啥卵事, 其实已经破坏了数组结构【在linux 下 会被警告 不安全】
8.使用 fgets 读取一行,直到遇到回车符 [缺点 : 有可能 回车符被读取了【输入数据 比 指定长度小】]
9. strlen();// 计算字符串的长度
10.字符串的拷贝 strcpy 【是 覆盖式拷贝】strcpy(目标位置,源的位置,拷贝个数);注意 拷贝个数 是个诡异的效果,前面拷贝后面不动 【拷贝个数不够时 拿0 来凑】
危险的地方: 容易越界
11.字符串链接 st
数组的讲解:
1.数组是多个元素的“组合”;
2.每个元素的数据类型,必须相同;
3.每个元素在数组中有一个“下标”,用来表示它在数组中的“序号”,下标从0 开始计算;
4.数组的“容量” 是不能改变的;【就是说, 你定了32 他最多只能存32个元素】
数组的定义
inta; //定义了一个数组,数组名为 "a" ,包含8个元素,每个元素 都是int 类型的变量
a=20;
a=5; // 这样进行访问
数组的初始化 :就是定义一个值int a ={1,3,5,6};
输出 printf("a=%d,a=%d",a,a);
当数组初始化为 : a ={0} ; 表示 a =0,由于后面的元素 都没有设置 , 所以a-a都是0 ;
当数组初始化为 : a ={1,2,3} ;同上 前面是 1 2 3 后面全是0 ;
设定数组时,必须指定元素个数 , 如果没有就是这样也行 : int a[] = {1,2,34,4}; 当知道指定元素时, 可以是省略
利用 sizeof(a) 算出数组内存,从而 算出数组长度
写几个语法错误1: int a;
a = {1,2};// 这样写法是错的, 不能对数组名直接赋值
2. int a;
a = 10 ;// 下标越界 !下标的范围是0,1,2 // 注意 这样写 访问的是 别的数据的内存
*/
小练习一: 数组求平均值
#include <stdio.h>
int main(void){
// 教程里的方法 求平均值
int data;
printf("请输入5个整数:");
scanf("%d%d%d%d%d",&data,&data,&data,&data,&data);
float y ;
y = ( data + data + data + data + data ) / 5.0; //因为设置了被除数是浮点数,所以结果也是浮点数
printf("平均值为:%f\n",y);
return 0;
// 我自己的方法 求平均值
// int t[] = {12,36,48,52,65};
int t[] = {1,2,3,4,5};
int len; // 存储数组的长度
len = sizeof(t)/sizeof(t);
// 使用for循环求和
int m =0; // 总和需要注意的是 这时m 不能不赋值0
int i; // 注意了 这个申明在外部
for(i=0; i<len; i++){
printf("这时m是:%d\n",m);
m += t;
}
// 再来个除法运算
int p = m / len;
printf("五数之和为:%d\n",m);
printf("长度为:%d\n",len);
printf("平均数为:%d\n",p);
return 0;
} 小练习二, 输入字符串 ,判断输入的长度
#include <stdio.h>
#include <string.h>
// 需求 输入一个人的姓名,然后输出这个字符串的长度
int main(void){
char name;
printf("请输入哥的名字:");
// name = gets();// 这里也可以用 fgets() // fgets 比 gets安全
// fgets(name,size(name),stdin); // 这样写的问题是 , 如果不到31个 会读入回车符【所以出现这种情况要删掉回车符】
scanf("%s",&name);
// printf("大爷我叫:%s",name);
int len = strlen(name);
printf("这个字符串的长度是:%d",len);
return 0;
}
C 语言中字符串的比较
#include <stdio.h>
#include <string.h>
int main(void){
char m = "laomo";
char k;
printf("请输入一个字符串:");
scanf("%s",&k);
int t;
t = strcmp(m,k);
printf("K的值是:%s\n", k);
printf("结果为:%d",t);
return 0;
}
/*
strcmp(a,b) : 字符串比对
如果 a>b[注意这个大小比对,是我估计是按照 ASCII表来的] 就是 1这个1不一定 反正>0
如果 a=b就是 0;
如果 a<b就是 -1 这个-1不一定 反正<0
比较是根据 从前向后比较, 根据ASCII值 ; 即:字符串 h 比 i 大 值为 1
缺点:
字符串输入的时候, 一般使用 fgets(str,sizeof(str),stdin); 当使用这玩意输入时, 判断里其实有个回车符 ,所以 比较的结果不正确
解决这个缺点的办法:
1. 给 申明str 变量时 写成 str = "Rock\n" ; // 就是加入末尾的 字符串结束符, 这讲解的啥玩意 真坑
2. 使用 strncmp(str1,str2,strlen(str1));//第三个参数是字符串长度是规定字符串长度即可【指定长度】 也是 【最多比较 的字符串长度】
*/
页:
[1]