<21>【理解】字符数组定义+【掌握】字符数组初始化和引用+【掌握】以字符串的形式输入和输出+【掌握】字符串结束符+【掌握】字符串长度计算方法+【理解】字符串处理函数+应用:单词首字母大写&统计单词个数

【理解】字符数组定义

 字符数组的定义:

 

    1)一维字符数组(用来存储字符的数组)定义

 

       char  数组名[数组长度];

 

       char ch[5];

       char ch[5+2];

       int len = 4;

       char ch[len];

       char ch[M+2]; //M是宏定义字符

 

 

    2)二维字符数组的定义

 

       char arr[4][10];

 

【掌握】字符数组初始化和引用

 

 字符数组初始化和引用

 

    1、初始化

 

       1)定义同时进行初始化

 

          char ch[5]={'a','b','c','e','f'};

          char ch[]={'a','b','c','e','f'};

 

          char ch1[3]={'a'}; // a \0 \0

          char ch2[5]={[3]='b'};

 

       2)先定义,后初始化

 

          char ch3[3];

          ch[0] = 'a';

          ch[1] = 'b';

          ch[2] = 'c';

 

    2、引用(遍历)

 

 

    3、字符数组是用来保存字符串的

 

       字符数组作用:

 

       1)保存字符

       2)保存字符串

 

          //用字符数组保存字符串,第一种初始化方法

          char str[4]={"abc"};

          //str[0]  a

          //str[1]  b

          //str[2]  c

          //str[3]  \0

 

 

         //第二种初始化方法

         char str2[4]="abc";

 

 
#include <stdio.h>



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

    

    //定义数组

    char ch[5]={'a','b','c','e','f'};

    char ch4[]={'a','b','c','e','f'};

    

    char ch1[3]={'a'}; // a \0 \0

    char ch2[5]={[3]='b'};

    

    char ch3[3];

    ch3[0] = 'a';

    ch3[1] = 'b';

    ch3[2] = 'c';

    

    //用字符数组保存字符串

    char str[4]={"abc"};

    //str[0]  a

    //str[1]  b

    //str[2]  c

    //str[3]  \0

    //字符数组存储字符串的第二种初始化方式

    char str2[4]="abc";  //注意,此处数组长度必须是>=4

    

    

    //

    char str3[]= "helloworld!";

    

    for (int i=0; i<sizeof(str3); i++) {

        printf("%c\t",str3[i]);

    }



    

    return 0;

}
h    e    l    l    o    w    o    r    l    d    !12

 

【掌握】以字符串的形式输入和输出

 

#include <stdio.h>



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

    

    //1、%s输出字符串

    //保存字符串

    char str[]="asdafasdft";

    printf("%ld\n",sizeof(str));

    //str[0] i

    //str[1] t

    

    //%c,我们要查看的是一个字符串,每次打印的是一个字符,这个显然不方便

    for (int i=0; i<10; i++) {

        printf("%c",str[i]);

    }

    printf("\n");

    //用%s输出一个字符串

    //从给定的地址开始,一直输出字符,直到遇到\0就停止了 //str[0]  ----> i

    printf("%s\n",str);

    //

    printf("%s\n",&str[0]);

    

    //&str[3] ----> ast

    printf("%s\n",&str[3]);

    

    //把一个字符数组,用%s进行输出,要加上\0

    

    char ch[10]={'a','b','c','d','\0'};

    printf("%s\n",ch);

    

    //2、%s接收键盘上输入的一个字符串

    char str3[10]; //

    //从键盘上接收一个字符串,保存在以str为首地址的字符数组中

    scanf("%s",str3);

    

    printf("--->%s\n",str3);  //把字符数组,以%s的格式输出

    

    //注意点:

    //1、如果以%s格式进行输入的话,注意空格问题

    //如果输入的字符串有空格,则空格之后的字符无法被接收保存

    //(以%s的格式输入,scanf遇到了空格,就结束了)

    

    //2、输入的字符串的长度要小于数组的长度

    return 0;

}
11

asdafasdft

asdafasdft

asdafasdft

afasdft

abdd

sfdsf

--->SFDSF           //这里我也感到莫名其妙,为什么说大写

【掌握】字符串结束符

 

#include <stdio.h>



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

    

    //定义了一个字符串  abc

    char str[]="abc";

    //实际上存储了

    // str[0] a

    // str[1] b

    // str[2] c

    // str[3] \0

   printf("%ld\n",sizeof(str));  // 3  4?

    

    //存的是字符,可以以%s输出

    char ch[]={'a','\0','c'};        //遇到\0就不动了

    char ch1[]={'x','y','z'};

    printf("%s\n",ch);

    printf("%s\n",ch1);  //xyz



    char str2[]="asfasdfa\0sdfasdf";

    printf("%s\n",str2);



    return 0;

}
4

a        

xyza

asfasdfa

 

【掌握】字符串长度计算方法

#include <stdio.h>





void test(){



    //字符串的长度:

    //此处 字符串的长度 恰好等于了 数组在内存中占用的字节数

    char str[]="abc";

    printf("%ld\n",sizeof(str));  //4

    

    char str1[]="abc\0def";

    printf("%ld\n",sizeof(str1)); //4 7 8      是8,所以这时候字符串的长度 就不等于了 数组在内存中占用的字节数

    

    //所以有专门的计算字符串长度的方法

    //1)使用字符串函数

  // printf("strlen--->>%d\n",strlen(str1)) ;  后面讲

    

    //2)以'\0' 作为条件,进行判断 遇到\0 就结束

    // \0之前的就是字符串的长度

    

    //不知道数组的长度的情况下,计算字符串的长度

    char str2[100]="asd";  //包含\0 4  不包含\0 3

    

    

    printf("%d\n",sizeof(str2));

    int i=1;

    //

    while (str2[i-1]!='\0')i++;

    printf("%d\n",i);



}

/**

 *  查找字符在字符串中首次出现的位置

 *

 *  @param str <#str description#>

 *  @param key <#key description#>

 *

 *  @return <#return value description#>

 */

int searchChar(char str[],char key){



    //通过循环依次取得字符串的每一个字符,

    

    //循环结束条件 str[i]!='\0'

    for (int i=0; str[i]!='\0'; i++) {

        if (str[i]==key) {

            return i;

        }

    }

    // 如果没有结束,开始比较 key  str[i]



    return -1;

}





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

   

    

    test();

    char str1[]="asdfasxyasdfasdkdasf";

    int loc = searchChar(str1,'d');

    printf("角标是%d\n",loc);

    

    return 0;

}
4

8

100

4

角标是2

【理解】字符串处理函数

 字符串函数的使用

 

      使用puts和gets 必须包含头文件 stdio.h 

 

      puts()    输出一个字符串

 

 

      原来输出字符串的方法

      char str[]="abc";

      printf("%s\n",str);

 

      puts(字符数组名);

 

 

      gets()    输入一个字符串

 

 

      原来接收一个字符串

 

      char str1[100];

      scanf("%s",str1);  //缺陷,输入字符串的时候不能有空格

 

      gets(数组名);

 

      需要包含 string.h的头文件

      strcat()  连接一个字符串,把两个字符串连接成一个字符串

                A B两个字符串

      strcat(A,B)  把字符串B连接到A的后面去

 

 

 

 
 1 #include <stdio.h>

 2 #include <string.h>

 3 

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

 5     

 6     char str[]="abc";

 7    // printf("%s\n",str);

 8     

 9     //puts(字符数组地址);

10     //1)puts函数可以自动换行吗? 可以

11     //2)也可以不是数组的首地址,可以是元素的地址

12     //3)必须是字符数组

13     //4) 不可以格式化输出

14     puts(str);

15     puts(&str[1]);

16     

17 

18     char str1[10];

19     //使用gets会给出一个警告

20     //1)warning: this program uses gets(), which is unsafe.

21     //2)不安全:数组长度是100,但是如果你输入了120个字符,存在越界问题

22     //3)使用gets可以接收空格

23     gets(str1);              //这种写法是不安全的 

24     puts(str1);              

25     

26     //字符串的函数

27     //strcat 函数介绍,使用该函数必须要引入头文件

28     //1)格式:strcat(oldStr,newStr);

29     //2) oldStr的长度要足够到,只要能够保存下oldStr+newStr

30     //3) newStr 把oldStr的最后一个字符\0给覆盖了

31     char str2[100]="w";

32     char str3[]="itcast!";

33     

34     strcat(str2, str3);

35     puts(str2);            //输出的是新字符串

36     puts(str3);

37     

38    

39     

40     printf("%p\n",&str2[1]);

41     printf("%p\n",str3);

42     

43     return 0;

44 }

abc

bc

warning: this program uses gets(), which is unsafe.

sdfdfafdfdgafdgv   aefdgvagdf

sdfdfafdfdgafdgv   aefdgvagdf

witcast!

itcast!

0x7fff5fbff6d1

0x7fff5fbff6c8

(lldb)                                

 

strcpy  字符串拷贝函数

 

    strcpy(oldStr,newStr);

    把newStr拷贝到oldStr中,newStr会覆盖掉oldStr中的内容

 

    strcmp  字符串的比较函数

    strcmp(str1,str2);  //比较两个字符串的大小

    //abc

    //def  大     规则:比较字符的ascii码值   比较在字典中出现的顺序

 

    //abc  大

    //aac

    //比较的过程:逐个取两个字符串的字符对应位相比较,从第一位不相同的位开始,就能确定字符串大小

 

    strcmp(str1,str2) 函数有返回值  > 0    str1>str2

                                  < 0    str1<str2

                                  ==0    str1 == str2

 

 

    strlen  字符串的长度计算函数

 

 
 1 #include <stdio.h>

 2 #include <string.h>

 3 

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

 5     

 6     char str1[100]="aaaaaa";

 7     char str2[]="bangzhang";

 8     puts(str1);

 9     //字符串的拷贝

10     //str1要足够大,否则可能会越界

11     strcpy(str1, str2);

12     //str2 拷贝到str1中  str2压在了str1上

13     puts(str1);

14     puts(str2);

15     

16     //strcmp 比较两个字符串的大小

17     int s = strcmp(str1, str2);

18    

19     printf("s=%d\n",s);

20     

21     //strlen计算字符串的长度

22     //strlen不含\0

23     int s1= strlen(str1);

24     printf("s = %d\n",s1);

25     return 0;

26 }
aaaaaa

bangzhang

bangzhang

s=0

s = 9

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

 1 #include <stdio.h>

 2 

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

 4     

 5     //定义变量

 6     char str[100];

 7     int isWord = 0;

 8     int count = 0; //统计单词的个数

 9     //提示用户输入字符串

10     printf("请输入一个字符串:\n");

11     //接收字符串,并保存到数组中

12     gets(str);

13     //循环取出每一个字符  遇到\0 循环结束

14     for (int i=0; str[i]!='\0'; i++) {

15         

16         //判断

17         if (str[i]==' ') {

18             //把是否是单词标记改一下

19             isWord = 0;  //这是一个标记,words=0表示是一个单词

20         }else if(isWord == 0){

21              //    当前循环 字符是空格 下次循环一定是一个单词

22             count++;

23             str[i] = str[i]-32; //减去32就大些了

24             isWord = 1; // 让单词标志变为不是单词

25         }

26         

27     }

28     printf("单词个数:%d,字符串:%s\n",count,str);

29     //puts(str);

30     

31     return 0;

32 }
请输入一个字符串:

warning: this program uses gets(), which is unsafe.

dfasdfasgf fgdsaf dasfgasg sad

单词个数:4,字符串:Dfasdfasgf Fgdsaf Dasfgasg Sad

 

你可能感兴趣的:(字符串处理)