老莫的笔记本  
  
查看: 1377|回复: 3

C语言的 字符串 与 数组

[复制链接]

662

主题

878

帖子

5143

积分

超级版主

Rank: 8Rank: 8

积分
5143
发表于 2019-2-19 23:30:11 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>
  2. #include <string.h>
  3. /*
  4.         1.将用户名和密码 以字符串的 形式来实现
  5. */


  6. int main(void){
  7. //        char name[32];    // 利用字符串数组名 保存字符串
  8. //        char pwd[16];       
  9.        
  10. //        printf("请输入用户名:");
  11. //        scanf("%s",name);                        // 这里 不需要加入 & 号【原因 &name 表示的是变量name的地址, 而 name[32] 本身就是地址】
  12. //        printf("请输入密  码:");
  13. //        scanf("%s",pwd);                        // 注意了 这里是 s%

  14. //        printf("您输入的用户名为:%s ; 您输入的密码是 %s\n", name, pwd);
  15.        
  16.        
  17.        
  18.        
  19.        
  20.        
  21. //        int a[] = {2,4,7,8,6};
  22.        
  23.         // 这个计算 是利用内存, 且 数组的元素类型相同(内存相同), 计算出 数组中元素的个数
  24. //        printf("数组占了 %d 个字节,一共有   %d 个元素", sizeof(a), sizeof(a)/sizeof(a[0])  );
  25.        
  26.        
  27.        
  28.        
  29.         // 怎么合理的控制字符长度
  30. //        char name[] = "laomo";  //这样会自动设置name长度 为 6 【为什么是6呢,因为字符串结束符也占一个字节 \0】
  31.        
  32.        
  33.         // 再添加一个坑爹的字符串截取方式
  34. //        name[3] = 0; // 相当于字符串结束符 '\0'   后面如果打印 就打印出来 lao  就这么坑
  35.        
  36.                
  37.         //        使用 gets 输入字符
  38. //        char name[34];
  39. //        gets(name);
  40. //        printf("胖爷输入的是:%s",name);
  41.        
  42.         //        使用 fgets 输入字符
  43. //        char name[8];
  44. //        fgets(name,8,stdin);        // 参数:数组名 , 长度, 标准输入设备  【长度是8,最多读7个】  // 也可以 fgets(name,sizeof(name),stdin);
  45. //        printf("胖爷输入的是:[%s]\n",name);  // 有可能 回车符被读取了【输入数据 比 指定长度小】

  46.         //        计算字符串的长度,strlen
  47. //        char name[] = "laomo";
  48. //        printf("name的长度是:%d",strlen(name));  //len = 5  恕我直言 这居然不包括 字符串结束符

  49.         //        字符串的拷贝strcpy 特点:把原字符串的结束符 也拷贝到新字符串中
  50. //        char name[43];
  51. //        char key[32];
  52. //        printf("请输入一个字符串:");
  53. //        scanf("%s",&name);
  54. //        strcpy(key,name);        // 把 字符串name 拷贝到 字符串key 中

  55. //        printf("key=%s",key);  
  56.        
  57. //        char t[43] = name;                // 这样写是不对的       
  58. //        printf("t的值是%s",t);
  59.        
  60.        
  61.         // 字符串的拼接接 strcat
  62.         char k[23];         // lao
  63.         char b[42];                // mo
  64.         printf("请输入一个字符串:");
  65.         gets(k);
  66.         printf("请再输入一个字符串:");
  67.         gets(b);
  68.        
  69.         // strcat(k,b); 得出结论 拼接字符串后,原字符串已经更改掉了
  70.         printf("拼接出来的字符串是:%s\n",strcat(k,b));        // laomo
  71.         // 这个时候打印
  72.         printf("此时k为:%s\n",k);        // laomo
  73.         printf("此时b为:%s\n",b);        // mo
  74.        
  75.        
  76.        
  77.        
  78.         return 0;
  79.        
  80. }

  81. /*
  82.         字符串的讲解:
  83.         1.本质 字符串就是0个或者多个“字符”组成的有序序列 ;
  84.        
  85.         2. 字符串长度  字符串包含的字符个数 ;
  86.        
  87.         3. 字符串结束符
  88.           在C语言中,为了便于存储字符串,要求在最后一个字符的后面存储一个0(一个字节)。
  89.           这个0,称为“字符串结束符”,常用“”表示;
  90.        
  91.         4.字符串常量
  92.            字符串常量,要求用"" 扩起来。  %s 用来匹配字符串 ;  必须是双引号
  93.           
  94.         5.字符串的存储
  95.                 在C语言中,字符串是以“字符数组”存储的。
  96.        
  97.         6.字符串的输入
  98.                 scanf("%s", name);  //数组名 与普通变量不同,它本身就表示一个地址;
  99.                 // scanf 输入时,遇到空格,就以为输入完了 很是尴尬 所以就有了以下几个
  100.                
  101.         7.使用 gets 输入字符【 不读取回车符与换行符 】
  102.                 特点: 1.能够读取 空格、制表符,但是不读取回车符 ; 2. 使用方便
  103.                 缺点: 2.超过长度没啥卵事, 其实已经破坏了数组结构【在linux 下 会被警告 不安全】
  104.                
  105.         8.使用 fgets 读取一行,直到遇到回车符 [缺点 : 有可能 回车符被读取了【输入数据 比 指定长度小】]
  106.                
  107.         9. strlen();  // 计算字符串的长度
  108.        
  109.         10.字符串的拷贝 strcpy 【是 覆盖式拷贝】strcpy(目标位置,源的位置,拷贝个数);  注意 拷贝个数 是个诡异的效果,前面拷贝后面不动 【拷贝个数不够时 拿0 来凑】
  110.                         危险的地方: 容易越界
  111.                        
  112.         11.字符串链接 st       
  113.                
  114.        
  115.        
  116.         数组的讲解:
  117.         1.数组是多个元素的“组合”;
  118.         2.每个元素的数据类型,必须相同;
  119.         3.每个元素在数组中有一个“下标”,用来表示它在数组中的“序号”,下标从0 开始计算;
  120.         4.数组的“容量” 是不能改变的;  【就是说, 你定了32 他最多只能存32个元素】
  121.        
  122.         数组的定义
  123.         int  a[8];                //定义了一个数组,数组名为 "a" ,包含8个元素,每个元素 都是int 类型的变量
  124.         a[0]=20;
  125.         a[1]=5; // 这样进行访问
  126.        
  127.         数组的初始化 :  就是定义一个值  int a[4] ={1,3,5,6};  
  128.         输出          printf("a[0]=%d,a[2]=%d",a[0],a[2]);
  129.        
  130.         当数组初始化为 : a[8] ={0} ; 表示 a[0] =0,由于后面的元素 都没有设置 , 所以a[1]-a[7]都是0 ;
  131.     当数组初始化为 : a[8] ={1,2,3} ;  同上 前面是 1 2 3 后面全是0 ;
  132.        
  133.         设定数组时,必须指定元素个数 , 如果没有  就是这样也行 : int a[] = {1,2,34,4};   当知道指定元素时, 可以是省略
  134.         利用 sizeof(a) 算出数组内存,从而 算出数组长度
  135.        
  136.         写几个语法错误1: int a[2];
  137.                                          a = {1,2};  // 这样写法是错的, 不能对数组名直接赋值
  138.                                          
  139.                                   2. int a[3];
  140.                                                 a[3] = 10 ;  // 下标越界 !下标的范围是0,1,2       // 注意 这样写 访问的是 别的数据的内存
  141.                                
  142.        
  143.        
  144.        
  145. */



复制代码


回复

使用道具 举报

662

主题

878

帖子

5143

积分

超级版主

Rank: 8Rank: 8

积分
5143
 楼主| 发表于 2019-2-20 23:07:02 | 显示全部楼层
小练习一: 数组求平均值
  1. #include <stdio.h>

  2. int main(void){
  3.        
  4.         // 教程里的方法 求平均值
  5.         int data[5];
  6.         printf("请输入5个整数:");
  7.         scanf("%d%d%d%d%d",&data[0],&data[1],&data[2],&data[3],&data[4]);
  8.         float y ;
  9.         y = ( data[0] + data[1] + data[2] + data[3] + data[4] ) / 5.0; //因为设置了被除数是浮点数,所以结果也是浮点数
  10.         printf("平均值为:%f\n",y);
  11.        
  12.         return 0;
  13.        
  14.        
  15.        
  16.        
  17.         // 我自己的方法 求平均值
  18. //        int t[] = {12,36,48,52,65};
  19.         int t[] = {1,2,3,4,5};
  20.        
  21.         int len; // 存储数组的长度
  22.         len = sizeof(t)/sizeof(t[0]);
  23.        
  24.         // 使用for循环求和
  25.         int m =0;   // 总和  需要注意的是 这时m 不能  不赋值0
  26.         int i;   // 注意了 这个申明在外部
  27.         for(i=0; i<len; i++){
  28.                 printf("这时m是:%d\n",m);
  29.                 m += t[i];
  30.         }
  31.        
  32.         // 再来个除法运算
  33.         int p = m / len;
  34.         printf("五数之和为:%d\n",m);
  35.         printf("长度为:%d\n",len);
  36.         printf("平均数为:%d\n",p);
  37.        
  38.        
  39.        
  40.        
  41.         return 0;

  42. }
复制代码
回复

使用道具 举报

662

主题

878

帖子

5143

积分

超级版主

Rank: 8Rank: 8

积分
5143
 楼主| 发表于 2019-2-20 23:07:37 | 显示全部楼层
小练习二, 输入字符串 ,判断输入的长度
  1. #include <stdio.h>
  2. #include <string.h>

  3. // 需求 输入一个人的姓名,然后输出这个字符串的长度
  4. int main(void){
  5.         char name[32];
  6.        
  7.         printf("请输入哥的名字:");
  8.         // name = gets();  // 这里也可以用 fgets() // fgets 比 gets安全
  9.         // fgets(name,size(name),stdin);                // 这样写的问题是 , 如果不到31个 会读入回车符【所以出现这种情况要删掉回车符】
  10.         scanf("%s",&name);
  11.         // printf("大爷我叫:%s",name);  
  12.        
  13.         int len = strlen(name);
  14.         printf("这个字符串的长度是:%d",len);
  15.        
  16.         return 0;
  17. }
  18.        
复制代码
回复

使用道具 举报

662

主题

878

帖子

5143

积分

超级版主

Rank: 8Rank: 8

积分
5143
 楼主| 发表于 2019-2-24 23:22:19 | 显示全部楼层
C 语言中字符串的比较
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(void){
  4.         char m[32] = "laomo";
  5.         char k[33];
  6.        
  7.         printf("请输入一个字符串:");
  8.         scanf("%s",&k);
  9.        
  10.         int t;
  11.         t = strcmp(m,k);
  12.         printf("K的值是:%s\n", k);
  13.         printf("结果为:%d",t);
  14.        
  15.         return 0;
  16. }

  17.        
  18.         /*
  19.        
  20.                 strcmp(a,b) : 字符串比对
  21.        
  22.                         如果 a>b  [注意这个大小比对,是我估计是按照 ASCII表来的] 就是 1  这个1不一定 反正>0
  23.                         如果 a=b  就是 0;
  24.                         如果 a<b  就是 -1   这个-1不一定 反正<0
  25.                        
  26.                  比较是根据 从前向后比较, 根据  ASCII值 ; 即:字符串 h 比 i 大 值为 1
  27.                  
  28.                  
  29.                  缺点:
  30.                  字符串输入的时候, 一般使用 fgets(str,sizeof(str),stdin);   当使用这玩意输入时, 判断里其实有个回车符 ,所以 比较的结果不正确
  31.                  
  32.                  解决这个缺点的办法:
  33.                  
  34.                  1. 给 申明str 变量时 写成 str[32] = "Rock\n" ; // 就是加入末尾的 字符串结束符, 这讲解的啥玩意 真坑

  35.                  2. 使用 strncmp(str1,str2,strlen(str1));  //  第三个参数是字符串长度  是规定字符串长度即可【指定长度】 也是 【最多比较 的字符串长度】
  36.                  
  37.                  
  38.        
  39.         */
  40.        
  41.        
  42.        
  43.        
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表