C语言——字符串指针篇

说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
来源
  C语言中文网

前提知识

字符串(字符数组)

  在C语言中没有专门的字符串数据类型:string,一般通过数组的方法来实现,称为字符数组(存放字符的数组,实际上一系列字符集合(字符串)),如:

	char str[]="hello world!"	
	/这种写法最简洁,也可写为: char str[20]={"hello world!"}

  要注意:字符数组 只有在定义时才可一次性赋值,一旦定义完就只能一个个赋值
,如:

char str[4];
str = "abc";  										/错误
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';			/正确

注意事项

  ①字符串是一系列连续字符。若想在内存中定位一个字符串,不仅要知道开头,还需知道结束。开头就是数组名(或字符串名)但结束呢?
  C语言是通过\0表示结尾,故\0又称为:字符串结束标志符(位于ASCII码表中第0个字符或称NULL或称空字符。该字符没有任何效果
  ②C语言中,一般在用" "包围字符串下自动末尾添加\0,如:char[]="abc";,逐个赋值不会自动添加\0
  ③注意字符串长度大于数组时可能会为以后错误埋下伏笔,故正确做法若是长度为3的字符串,数组长度为4.
  ④在函数内部定义的变量、数组、结构体、共用体都被称为局部数据。很多编译器下局部数据初始值都是随机的,无意义的值而不是“零”值。故若未给字符数组赋初值0,则可能输出会出现输出超过数组长度的值或其他奇葩问题,故可通过:
    1)手动在字符串最后添加\0,如:str[i] = 0
    2)只初始化部分数组元素,那么剩余的数组元素也会自动初始化为“零”值,如:char str[30] = {0}; //将所有元素都初始化为 0,或者说 '\0'
  ⑤字符串长度函数:strlen()函数,用法:length strlen(strname);

#include<stdio.h>
#include<string.h>                      	/使用strlen需该头文件
int main(){
        char string[3] = "abc";
        int len = strlen(string);
        printf("%s\n",string);
        printf("len = %d\n",len);
        return 0;
}
实验结果:
	abc
	len = 3

  ⑥字符串输入输出
    (1)字符串的输出
      1)puts():输出字符串并自动换行,该函数只能输出字符串
      2)printf():通过格式控制符%s输出字符串,不能自动换行。还能输出其他类型的数据。
      注意:输出字符串时只需要给出名字,不能带后边的[ ]
    (2)字符串的输入
      1)scanf():通过格式控制符%s输入字符串。还能输入其他类型的数据。
      2)gets():直接输入字符串,并且只能输入字符串。
      注意(区别):
        scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
        gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,
        变量用scanf() 时都要在前面添加&,而数组或者字符串用于 scanf() 时不用添加&,它们本身就会转换为地址。

字符串处理函数

字符串连接函数 strcat()【 string catenate】

  语法格式:strcat(arrayName1, arrayName2);
  strcat() 将把 arrayName2 连接到 arrayName1 后面,并删除原来 arrayName1 最后的结束标志’\0’。这意味着,arrayName1 必须足够长,要能够同时容纳 arrayName1 和 arrayName2,否则会越界(超出范围)。

字符串复制函数 strcpy()【string copy】

  语法格式:strcpy(arrayName1, arrayName2);
  strcpy() 会把 arrayName2 中的字符串拷贝到 arrayName1 中,字符串结束标志’\0’也一同拷贝。

字符串比较函数 strcmp()【string compare】

  语法格式:strcmp(arrayName1, arrayName2);
  arrayName1 和 arrayName2 是需要比较的两个字符串。
  字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。
  返回值:若 arrayName1 和 arrayName2 相同,则返回0;若 arrayName1 大于 arrayName2,则返回大于 0 的值;若 arrayName1 小于 arrayName2,则返回小于0 的值。

字符串指针(指向字符串的指针)

  字符串指针:就是直接使用一个指针指向字符串.

    char str[] = "hello world";
    char *pstr = str;

  也可指直接用一个指针指向字符串(字符串常量):

	char *str = "hello world"	/还可写 char *str;   str = "hello world". 

  那这两种写法有什么区别么
    在内存中存储区域不同,字符数组存储在全局数据区或栈区,第二种形式字符串存储在常量区。【全局数据区和栈区 的字符串有读取和写入的权限,而 常量区 字符串只有读取权限,没有写入权限,这就导致了字符数组 在定义后可读取和修改每个字符而 第二种形式(字符串常量) 一旦定义后便不可修改,对它的赋值都是错误的(可整体赋值)】

#include <stdio.h>
#include <string.h>
int main(){
    char *str = "www.baidu.com";
    int i ;
    str = "hello world!";
	// str[3]='P';      						 可正常编译和链,但运行会出现错误。
    int len = strlen(str);
    //使用*(pstr+i)
    for(i=0; i<len; i++){
        printf("%c\t", *(str+i));
        printf("str[i] = %p\n",(str+i));
    }

    printf("%s\n",str);
    printf("int len = %d\n",len);
    return 0;
}

  字符数组归根结底还是一个数组,关于指针和数组的规则同样也适用于字符数组.故输出字符串也可以用:*(pstr+i)、pstr[i]、*(str+i) 、str[i]进行输出.

#include <stdio.h>
#include <string.h>
int main(){
    char str[] = "hello world";
    char *pstr = str;
    int len = strlen(str), i;
    //使用*(pstr+i)
    for(i=0; i<len; i++){
        printf("%c", *(pstr+i));
    }
    printf("\n");
    //使用pstr[i]
    for(i=0; i<len; i++){
        printf("%c", pstr[i]);
    }
    printf("\n");
    //使用*(str+i)
    for(i=0; i<len; i++){
        printf("%c", *(str+i));
    }
    //使用str[i]
    printf("\n");
    for(i=0;i<len;i++){
        printf("%c",str[i]);
    }
    printf("\n");
    return 0;
}

  • 42
    点赞
  • 317
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值