c语言3月16日学习总结

1.字符串的基本概念

字符串常量(用双引号括起来的)常量
汉字的编码方式

GB2312   GBK     ----> 2个字节

UTF-8            ----> 3个字节

    //定义了一个字符变量,存储了字符常量
    char ch='a';
    //定义了一个字符变量,但是存储了字符串常量(错)
    char ch1 = "a";
    printf("%c\n",ch1);

2.字符数组与字符串

  • 字符数组,用来存储字符 也可以用来存储字符串
    字符数组的定义的格式:

    一维: char 数组名[常量表达式];

       char ch[2];
    

    二维: char 数组名[常量表达式1][常量表达式2];

       char str[5][20];
    
  • 字符数组的初始化

 1) 定义的同时进行初始化
//    
//    (1)完全
    char str[4]={'a','b','c','d'};
    char str2[]={'a','b','c','d'};



    printf("\n");
    //(2)部分
    char str3[4]={'a'};     // a 0 0 0
    char str4[4]={[3]='c'}; // 0 0 0 c

    //2)先定义数组后初始化

    char str5[4];  //没有初始化的时候,里面的内容是随机的

    str5[3]='c';   //? ? ? c   

    //对字符数组进行遍历
    for(int i=0;i<4;i++){

        printf("*%d\t",str5[i]);

    }
    printf("\n");

    //用字符数组保存字符串
     char str6[10]={"hello"};
    for(int i=0;i<10;i++){

        printf("#%d\t",str6[i]);

    }
    printf("\n");
    char str7[10]="hello"; // h e l l o \0 \0 \0 \0


    //特别注意:

    char str8[10];
    //数组名是一个常量,常量的值是不允许修改的
    //str8 = "hello";  //(错)
  • 以字符串的形式输入和输出
  • 字符数组
    char str[5]={‘a’,’b’,’c’,’d’,’\0’};

    %c 逐个输出字符

    %s 从指定的地址开始,依次输出字符,直到遇到 \0 结束了


    //************** %s进行输出 **************
    //%s格式进行输出
    char str[]={'a','b','c','d','\0','e','f','\0'};
    //指定的时数组的首地址
    //    printf("%s\n",str);  //abcd
    //%s输出字符串
    char str2[]="abcdefg";
    //printf("%s\n",str2); //abcdefgabcd    

     //************** %s进行输入 **************

    // int num;
    // scanf("%d",&num);  //接收一个整数

    // %c 接收一个字符

    // scanf("%d,%c,%d",&a,&ch,&b);    
    // a = 45  ch = a  b = 56

    // %s 接收一个字符串
    // 注意: 以%s进行输入的时候,字符串的中间不能有空格
    //      以%s进行输入 遇到 空格 scanf 退出
    char str5[10];   //9字符+\0

    scanf("%s",str5);  //从键盘接收字符串,保存到指定的地址处

    printf("-----> %s \n",str5);
    //    int num;
    //    scanf("%d\n",&num);  //不会报错,但不建议使用
    //    printf("%d",num);
  • 字符串结束符的使用

    //1.%s输出的时候,不使用\0会造成多输出很多东西(随机的)
    //定义字符数组
    char str[5]={'a','b','\0','d','e'};
    // %s 从指定的地址开始,输出字符,直到遇到\0结束
    printf("str = %s\n",str);


    char str2[3]={'x','y','z'};
    printf("str2 = %s\n",str2);  //xyz ???


    //2.不当的使用\0
    char str3[]="abcdefa\0fsdasdf";
    printf("str3 = %s\n",str3);  //只输出abcdefa


    //3.字符串的长度问题
    char str4[10] ="hello";
    printf("%lu\n",sizeof(str4));  //无法计算
    printf("%lu\n",sizeof(str4)/sizeof(char)); //无法计算
  • 字符串长度计算方法
//计算字符串的长度:
    // 以 '\0' 作为结束条条件,做循环
    // 如果我们取得的字符不是 '\0',让计数变量+1

    //1.定义一个字符串
    char str[5]="abc";  // a b c \0 \0

    //2.定义一个变量保存字符的个数

    int count = 1;

    //3.循环变量i
    //    int i = 0;

    //判断是否到了字符串的末尾
    while(str[count-1]!='\0'){
        //让计数变量+1
        count++;
        //循环变量累加
        //        i++;
    }

    printf("count = %d\n",count);

练习:判断字符串中是否包含某个字符,如果包含,返回其首次出现的位置,否则返回-1

//1.定义一个函数(参数:字符串   要查找的字符)
int keyIndexOfString(char str[],char key){

    //2.循环,结束条件是 str[i]!='\0'
    for (int i=0; str[i]!='\0'; i++) {

        //3.判断,str[i]==key
        //返回 i
        if (str[i]==key) {
            //字符出现的位置(下标)
            return i;
        }

    }

    //4.for循环执行结束后,返回-1
    return -1;

3.字符串处理函数

  • 常见的字符串处理函数:

    1) puts 把字符串输出到控制台

char str[120]="cgx";
    //使用%s不会换行
    printf("I love %s",str);
    //使用puts函数可以自动换行
    //1)从指定地址开始,遇到\0结束
    //2)不能进行格式化输出
    puts(str);

    puts("zbz");

2) gets 从键盘接收一个字符串,保存到字符数组中

从键盘接收一个字符串,保存到字符数组中
    char str2[100];
    //使用scanf接收键盘输入的字符串,中间不能有空格
    //scanf("%s",str2);
    //使用gets 会给出提示
    //1)warning: this program uses gets(), which is unsafe.
    //2)使用gets输入字符串的时候,字符串中间可以有空格
    gets(str2);
    puts(str2);

3) strcat 字符串的连接函数

//返回的是str的地址,保存到str数组中
    char str[] = "abc";
    char str2[] = "def";
    strcat(str, str2);
    //puts(str);
    printf("连接后的字符串:%s",str); // abcdef

4) strcpy 字符串的拷贝函数

    //strcpy(str1,str2);
    //把str2的内容,拷贝到 str1中
    //注意:
    //1)str1中原来的内容被覆盖了
    //2)str1的长度>=str2的长度,如果小于则越界了

    char str[100]="cjk";
    char str2[]="hello";
    //拷贝
    strcpy(str,str2);
    puts(str); // hello

5)strcmp 字符串比较函数

 //比较的原则上: 1)比较他们的ascii码值 
 //            2)比较字典中出现的顺序(越靠后,越大)
    //strcmp(str1,str2);   //返回的比较的结果
    // >0     str1 > str2
    // ==0    str1 == str2
    // <0     str1 < str2

    char s1[]="ad";
    char s2[]="bd";

    printf("%d\n",strcmp(s1, s2)); // -1

6) strlen 计算字符串的长度

    // 返回的时可见的字符的个数
    //int len = strlen(s1);
    printf("%lu\n",strlen(s1));

    char str3[]="我爱中国";
    // 一个汉字默认是 utf-8 编码,占用3个字节
    printf("%lu\n",strlen(str3));  //长度为12

练习:应用:单词首字母大写&统计单词个数

/*
     使用gets()函数从键盘输入一个字符串,判断输入的有多少个单词?
     */

    //1.定义数组
    //  定义变量 (记录状态的变量,记录单词的个数)

    char str[100];
    int count = 0;  //记录单词的个数
    int isWord = 1;

    //2.接收一个字符串

    gets(str);
    //     4
    // abc hello    ddd
    //3.获取字符串的每个字符,如果遇到\0,就退出,否则循环
    for (int i=0; str[i]!='\0'; i++) {

        //4.判断是否是一个单词(如果出现了空格,而空格后面的字符友不是空格,这是一个单词)
        if (str[i]==' ') {

            isWord = 1;  //表示这是一个单词的开始

            //a   97
            //A   65
            //32
        }else if (isWord==1){

            str[i] = str[i]-32;
        //5.如果是一个单词,我们最好用一个变量记录下
            count++;
            //设置不是一个单词
            isWord = 0;
        }
    }

4.一级指针

  • 变量的存取方式
 int num = 10;
    //使用变量名num获取num中存储的内容,直接存取
    int sum = num+10;   //10

    //  num -->0xff01
    //  0xff01 -->  10  ,通过地址存取内存单元的值,间接存取
  • 指针变量概念及定义方法
    //指针变量
    //指针: 地址
    //指针变量:专门用来存放地址的变量

    //指针变量定义:
    //格式: 数据类型 * 指针变量名;
    // int num;
    // int num; // int num; //int * num;

    //注意:
    //1)指针变量只能用来存放地址
    //2)* 表示这个变量是一个指针变量
    //3)int 表示当前指针变量以后只能存放 int类型的变量的地址
    //4)指针变量也区分全局的和局部的

  • 指针变量的初始化和引用

//指针变量的初始化
void test2(){


    //定义普通的整型变量
    int a=3,b=3;
    int x=2,y;

    double d1 = 3.14;


    //指针变量的初始化
    //1)定义的同时进行初始化

    int *p = &a;   //p指向了a

    //2)先定义指针变量,然后再初始化

    int *p1;
    p1 = &b;

    //3)可以用一个已经存在的指针变量初始化
    int *p2 = p;

    //4)给指针变量赋值 NULL
    int *p3 = NULL; //表示 指针变量 p3指向内存中地址为0的地方
    int *p4 = 0;    //这是比较特殊

    //5)指针变量可以被重新赋值(指向发生改变)
    int *p5 = &x;
    p2 = p5;        //指针的指向可以发生改变

    int *p6;        //p6 存放的时垃圾值

}

int main(int argc, const char * argv[]) {

    //定义普通的整型变量
    int a=3,b=3;

    //指针变量的初始化
    //1)定义的同时进行初始化

    int *p = &a;   //p指向了a
    printf("ssssssa  = %ld\n",sizeof(p));


    //直接访问
    printf("a  = %d\n",a);   //3


    //使用* 获取指针变量指向的内存空间的内容
    printf("*p = %d\n",*p);  //3

    //使用* 设置指针变量指向的内存空间的内容
    *p = 100;

    printf("*p = %d\n",*p);  //100

    //注意: * 使用场合有两个
    //1) 用在定义变量的时候,表示 定义的时一个指针变量
    //2) *指针变量名    表示,获取指针变量指向的内存空间的内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值