黑马程序员--C语言自学笔记---10字符串、指针

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


1.   字符串输出

1)   以字符数组来存储字符串,输出时使用数组名以%s格式输出

printf(“%s\n”,str);str为字符数组名

2)   字符串从给定地址开始输出,遇到\0就停止

2.   字符串输入

1)        同样使用数组名来接收,使用%s格式scanf(“%s”,str);str为字符数组名

2)        使用%s来输入字符串,如果输入中有空格,则空格后的内容无效,也就是说遇到空格就再不接收输入

3.   字符串结束符的使用

注意:使用%s输出时,如果当前数组中只有多个字符,没有\0,则会打印出其他一些东西,知道遇到内存中的\0才停止,所以不安全。

4.   字符串长度计算方法

1)        通过字节数来判断

2)        使用字符串长度计算函数strlen();

 

5.   字符串处理函数

1)        puts:输出一个字符串,puts(字符数组名),自动换行

①  必须是字符数组

②  可以不是数组首地址,也可以是某个元素的地址

③  不能进行格式化输出

2)        gets:输入一个字符串,

①  不安全,如果输入长度大于定义的字符数组的长度,也可以输出,不会报错

②  可以接收空格

3)        strcat:连接字符串,要包含头文件string.h

①  格式为:strcat(oldstr,newstr)

②  把newstr连接到oldstr的后面

③  oldstr的长度要足够大,至少应该是oldstr和newstr长度之和,相当于newstr把oldstr中最后一个字符\0给覆盖了

4)        strcpy字符串复拷贝函数

①  strcpy(oldstr,newstr),用newstr覆盖掉oldstr,newstr内容不变

②  oldstr长度足够大 

5)        strcmp:比较两个字符串的大小

①  格式为:strcmp(str1,str2)

②  对str1和str2中字符从左到右进行比较ascii码值,跟长度无关

③  str1大,结果为正数;str2大,结果为负数;相等结果为0.

6)        strlen:计算字符串的长度,不包括\0,比如:char str[100]=”abcde”;

sizeof(str)的结果为100,而strlen(str)的结果为5.

6.   应用:字符串单词首字母大写以及统计单词个数

#include 
int main(int argc, const char* argv[]) {
    //定义数组变量,以及标志变量和计数变量
    int count = 0;
    int word = 1;
    char str[50];
    //提示用户输入字符串
    printf("请输入一个字符串:\n");
    //接收字符串
    gets(str);
    //循环字符串,遇到\0结束
    for (inti=0; str[i]!='\0'; i++) {
        //判断
        if(str[i] == ' ') {
            //是空格的话改标记
            word = 1;//表示假设下一个为单词首字母
        }elseif(word == 1){
            //当前是单词首字母
            count++;            //计数单词个数
            str[i] = str[i]-32;//小写字母变大写
            word = 0;           //下一个不是单词首字母
        }
    }
    printf("单词个数为:%d\n",count);
    puts(str);
    return0;
}


7.   指针:就是一个内存地址,是一个常量,通过地址来操作

1)        指针变量:用来存放指针的变量

①  指针变量类型要与指向的变量的类型相同

②  定义指针变量时一定要有 *

③  指针变量不能用来存放数值或字符,只能存地址

④  指针变量也具有全局性和局部性

 

8.   指针变量的初始化和使用

1)        先定义,然后初始化,再使用(使用指针变量对内存地址进行操作)

2)        指针变量不初始化有什么后果?

①  不初始化存放的是一个垃圾值,指针为野指针

②  一定要避免野指针int *p;值为垃圾值,有可能为存放的是系统程序的地址,*p=10;可能会把系统中某个空间的值改为10,可能会使系统崩溃

3)        指针变量如何进行初始化,使用地址进行初始化

①  定义的同时初始化

a.   完全初始化

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

int *p1=&a,*p2=&a;p1,p2都指向了a

 

b.   部分初始化

int *p1=&a,*p2;  p2=&a;

②  先定义后初始化

③  可以先定义一个指针变量而不用指向任何变量

int *p1=NULL;int *p2=0;   把指针指向空,什么也不指。

④  常见错误:

int *p = 100;这种方法以后要杜绝,不要把一个数值给p,而应该是一个地址

4)        用指针来获取指向的内存单元的内容,*p代表p所指向的内存单元的内容

5)        用指针作为形参来定义函数来交换两数的值

//错误交换1

void swap1(int a,int b){
   int temp;
   temp = a;
   a = b;
   b = temp;
}

//错误交换2

void swap2(int *p1,int *p2){
   int *p;
   p = p1;
   p1 = p2;
   p2 = p;
   
}

//上面两种方法都是值交换的形参变量

 

//正确交换

void swap3(int *p1,int *p2){
   int temp;
   temp = *p1;
   *p1 = *p2;
   *p2 = temp;
}


9.   指针的应用

1)        在函数中通过指针变量来修改指针变量指向的内容

2)        通过指针让函数有多个返回值

两个应用:

#include 
//用指针改变主调函数中的值
void changeValue(int *p){
    *p = 100;
}
//让函数有多个返回值,并不是return多个值,而是看上去得到了多
个返回值
void caculator(int a,int b,int *add,int *jian,int
*cheng,float *chu){
    *add = a+b;
    *jian = a-b;
    *cheng = a*b;
    *chu = a/(float)b;
}
int main(int argc, const char * argv[]) {
    int p = 10;
    changeValue(&p);
    printf("p =%d\n",p);
    int add=0,jian=0,cheng=0;
    float chu=0.0f;
    caculator(12, 4, &add,&jian, &cheng, &chu);
   
    printf("add =%d\n",add);
    printf("jian =%d\n",jian);
    printf("cheng =%d\n",cheng);
    printf("chu =%.2f\n",chu);
    return 0;
}


10. 二级指针:就是存放另外一个指针变量的地址的指针(指向指针变量的指针变量)

11. 指针要区分类型

如果指针类型和指向的变量的类型不一致,用指针进行取值时,取到的内存中字节的大小与实际变量的大小不一致,比如说:指针类型为double类型的,而指向的变量的类型为int类型的,则指针在内存中要取8个字节,而int只有4个字节,所以会取到不属于这个变量的其他内存空间,所以结果可能会不一致;相反可能会只取到变量的一部分空间。

 

 


你可能感兴趣的:(黑马程序员--C语言自学笔记---10字符串、指针)