周大胖子 发表于 2019-2-19 23:30:11

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       // 注意 这样写 访问的是 别的数据的内存
                               
       
       
       
*/





周大胖子 发表于 2019-2-20 23:07:02

小练习一: 数组求平均值
#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;

}

周大胖子 发表于 2019-2-20 23:07:37

小练习二, 输入字符串 ,判断输入的长度
#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;
}
       

周大胖子 发表于 2019-2-24 23:22:19

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]
查看完整版本: C语言的 字符串 与 数组