码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员-C学习日记-字符串

时间:2015-12-13 17:07:01      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

 

------- ios培训、 android培训、java培训、期待与您交流! ----------

 

一.系统内存分区

    技术分享

总结:

栈:存放局部变量(函数中定义的变量),内存由系统管理

堆:存放对象,它由程序猿自己申请自己释放,内存需要程序猿自己管理

全局区:存放全局变量与静态变量,由系统管理

常量区:用来存放常量,内存由系统管理,它是只读区

代码区:存放代码的,内存由系统管理,它是只读区

 

二.定义字符串

1.定义字符串的第一种方式:使用字符数组

      char name[] = "sxl";

      name[1] = ‘y‘;// 此处可以修改字符串

2.使用char类型指针

      char *name1 = "ly";

     *name1 = ‘s‘;// 此处是错误的,因为这个指针指向常量区的字符串,所以不能修改其所指向的字符串

 

总结:字符数组在栈中存储,栈是可读可写的区域,字符的内容可以随意修改;

使用char类型指针定义的字符串,存储在常量区,它所指向内容不可以修改

 

使用场景:

当定义的字符串内容需要修改就是用字符数组定义

当定义的字符串不需要修改就是用字符指针定义

好处:1.常量区的东西无论使用多少次,在内存中只有一份

        2.效率高,省内存

        3.内容不可以修改,可以保证程序的安全

 

三.const关键字

const 修饰变量 说明定义的变量是只读的,格式: const 数据类型  变量名称

const 修饰数组 表示数组是只读的,必须定义的时候进行初始化

const 修饰指针 如果const放在*前面,表示指针指向的内容是只读的,如果放在*后面,表示指针本身是只读的,不能改变指向

const 修饰形参 保证这个形参不会被函数修改,同时也可以告诉函数的调用者,本函数不会修改它里面的内容,可以提高函数可读性

 

四.字符串数组

1.第一种定义方式:使用char类型的二维数组

 这里的字符串的字符元素放在栈中,是可以修改的

     char names[][20] = {

           "cl"

           "llj"

          "zzd"

          "cwz"

          "hjb"

          "lxl"

      };

2.第二种定义方式:字符指针数组

 数组中的字符串元素是不可以修改的

      char *names1[]={

          "cl"

          "llj"

         "zzd"

         "cwz"

         "hjb"

          "lxl"

      };

 

五:动态存储空间的使用

堆:动态存储区:它的内存由程序员管理

1.导入stdlib.h

  malloc(size_t size);

向操作系统申请堆中一块存储空间,如果操作系统分配成功,就会返回这个存储空间的地址,否则返回NULL

2.free(void *)告诉系统这块存储空间不再使用了

注意点: 有1malloc就有1free与之对应,否则会造成内存泄露

         释放过的指针不可以再次释放,否则程序会崩溃

#include <stdio.h>

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

    int *pi = malloc(sizeof(int));

    if(pi!=NULL){

       // 使用内存

        *pi = 20;

       //释放内存

       free(pi);

       printf("%d\n",*pi);

       //清空指针

       pi = NULL;

  return 0;

}

 

 

六.自己的理解

1.字符串和字符数组的区别

1)字符串有一个结尾标识\0,而字符数组以任意字符结尾,字符串根据\0来判断长度

2%s输出内容会检查是否遇到\0

3)字符数组部分初始化,没有显式初始化的元素会被初始化为0

4)当初始化一个字符数组的时候,如果没有把空间填满,那么这个字符数组就是字符串

2.接收用户录入字符串的三种方式

scanf:  不能接受带有空格的字符串,因为%s遇到空格就结束了

gets(): 可以读取空格,但不会检查数组长度,有可能导致数组越界

fgets(name,sizeof(name),stdin): 可以读取空格,会检查数组长度,比较安全

 

七.字符串常用函数:

1.用来计算字符串长度的函数(不包含\0

 size_t strlen(const char *str);

2.拷贝字符串函数

 strcpy(char * dest,const char * src);

ps:如果src长度超过dest所能容纳的长度可能导致程序崩溃

 strncpy(char * dest,const char * src,size_len); 

ps:使用strncpy拷贝比较安全,因为len表示要拷贝的字符长度(不包含\0

3.字符串拼接函数

 strcat(char * dest,const char * src);

src中内容拼接在dest原有字符串后面,从前往后找,找到第一个\0位置开始拼接

4.字符串比较函数

 strcmp(const char * src1,const char * src2);

str1str2从第一个字符开始比较,若相等就比较后面的字符。结果都相等就返回0,遇到不相等字符就返回这2个字符ASCII值的差

 

八.练习:从键盘上输入一大堆字符串,统计A,B,C,D出现次数,并按出现次数从大到小的顺序打印字母和出现次数

  1 #include <stdio.h>
  2 
  3 #include <string.h>
  4 
  5    int main(int argc ,const char *argv[]{
  6 
  7   //定义一个字符串并提示用户输入字符串
  8 
  9    char str[100];
 10 
 11    printf("请随机输入字符串,英文字母不分大小写\n");
 12 
 13    //接收用户的录入
 14 
 15    fgets(str,sizeof(str),stdin);
 16 
 17    // 计算字符串长度
 18 
 19     size_t strlen(str);
 20 
 21    //定义变量记录ABCD出现次数
 22 
 23     int countA,countB,countC,countD;
 24 
 25     countA=countB=countC=countD=0;
 26 
 27    // 遍历字符串
 28 
 29    for(int i=0;i<strlen;i++){
 30 
 31       //统计出现次数
 32 
 33        if(srt[i]=A){
 34 
 35          countA++;
 36 
 37         }
 38 
 39        if(srt[i]=B){
 40 
 41          countB++;
 42 
 43         }
 44 
 45        if(srt[i]=C){
 46 
 47          countC++;
 48 
 49         }
 50 
 51        if(srt[i]=D){
 52 
 53          countD++;
 54 
 55         }
 56 
 57      }
 58 
 59 printf("A出现%d次 B出现%d次 C出现%d次 D出现%d次\n",countA,countB,countC,countD);
 60 
 61   // 整型数组nums存放ABCD出现次数,字符数组letter存放ABCD
 62 
 63    int nums[4]={countA,countB,countC,countD};
 64 
 65    char letter[4]="ABCD";
 66 
 67    //利用冒泡排序,降序排列
 68 
 69    length = 4;
 70 
 71    for(int i=0;i<length-1;i++){
 72 
 73        for(int j=0;j<length-1-i;j++){
 74 
 75            if(nums[j]<nums[j+1]){
 76 
 77               int temp;
 78 
 79               temp = nums[j];
 80 
 81               nums[j]=nums[j+1];
 82 
 83               nums[j+1]=temp;
 84 
 85               char tempC;
 86 
 87               tempC = letter[j];
 88 
 89               letter[j] = letter[j+1];
 90 
 91               letter[j+1] = tempC;
 92 
 93             }
 94 
 95         }
 96 
 97     }
 98 
 99    //打印结果
100 
101    for(int i=0;i<4;i++){
102 
103     printf("%c:%d\n",letter[i],nums[i]); 
104 
105     }
106 
107   return 0;
108 
109 }

 

 

 

黑马程序员-C学习日记-字符串

标签:

原文地址:http://www.cnblogs.com/ly0709/p/5042986.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!