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

文章目录

  • 前提知识
    • 字符串(字符数组)
    • 注意事项
    • 字符串处理函数
      • 字符串连接函数 strcat()【 string catenate】
      • 字符串复制函数 strcpy()【string copy】
      • 字符串比较函数 strcmp()【string compare】
    • 字符串指针(指向字符串的指针)

前提知识

字符串(字符数组)

  在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;
}
实验结果:abclen = 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;
}

C语言——字符串指针篇相关推荐

  1. C语言重点——指针篇(一篇让你完全搞懂指针)

    C语言重点--指针篇(一篇让你完全搞懂指针) 一. 前言 C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的. 这篇我们就来讲解C语言的一大特点,也是难点,指针和 ...

  2. gorm存指针数据_C语言重点——指针篇(一篇让你完全搞懂指针)

    一. 前言 C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的. 这篇我们就来讲解C语言的一大特点,也是难点,指针和指针操作. 这篇文章我会先从基本类型的存储过程 ...

  3. C语言重点——指针篇(一文让你完全搞懂指针)| 从内存理解指针 | 指针完全解析

    有干货.更有故事,微信搜索[编程指北]关注这个不一样的程序员,等你来撩~ 注:这篇文章好好看完一定会让你掌握好指针的本质 C语言最核心的知识就是指针,所以,这一篇的文章主题是「指针与内存模型」 说到指 ...

  4. C语言字符串指针(指向字符串的指针)详解

    C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在<C语言字符数组和字符串>中已经进行了详细讲解,这里不妨再来演示一下: #include <stdio.h&g ...

  5. C语言字符串指针,指向字符串的指针,字符串结束标志

    画红色重点--字符数组和字符指针的根本区别: 它们最根本的区别是在内存中的存储区域不一样 ! 字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区.全局数据区和栈区的字符串(也包括其他数据) ...

  6. C语言——基础指针篇

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

  7. C语言杂谈——指针篇

    指针是C语言的难点,其原因是它拥有多重的含义.这给已熟练理解C语言指针精髓的程序员带来的好处是,可以天马行空的构建软件.但很不幸,我不是那些能够熟练理解并天马行空利用C指针的一员.对于我来说,是不是指 ...

  8. C语言——数组指针篇

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

  9. 【知识分享】C语言应用——指针篇

    一.概述     C语言基础大部分都很好理解,唯一入手门槛比较高的,就数指针了.指针是C语言的一大特色,因为指针,C语言可以极度灵活,但也因为指针,C语言变得很不安全.指针就是一把双刃剑,用好了可以让 ...

最新文章

  1. 关于javascript:void(0);,herf=”#”以及在IE6下,click事件失效的问题
  2. 分析手机网站的优势思维结构图_写了100多篇原创文章,我常用的在线工具网站推荐给大家...
  3. oracle存储while用mysql_oracle存储过程while
  4. 共识算法的比较:Casper vs Tendermint
  5. 点云网络的论文理解(一)-点云网络的提出 PointNet : Deep Learning on Point Sets for 3D Classification and Segmentation
  6. 如果给你一个亿,你想去干嘛?各专业的科研狗是这样回答的……
  7. [BZOJ 3173] [TJOI 2013] 最长上升子序列(splay)
  8. 【后端开发】分析抖音后台架构
  9. 我是如何在都柏林的一次中转中无意中写了维基百科页面的
  10. 2022-04-25 安装PostgreSQL的发现小bug
  11. npm安装vue-cli时速度慢,fetchMetadata经常卡住并报异常
  12. 微服务统一认证与授权的 Go 语言实现
  13. MD5加密——使用Java自带的MessageDigest工具类实现
  14. C# 使用 windowsmedia循环播放视频
  15. 证券交易系统搭建的架构方案
  16. 运放-环路控制系统-零点、极点、频宽、波特图、二阶、RC概念
  17. libsvm 2.6 的代码注释(支持向量机的神作)
  18. oracle数据库description,DESCRIPTION=(ADDRESSOracle12c环境下的EM配置和使用方法
  19. win10网络重置后wlan 不见解法 ,网卡黄色感叹号
  20. 仿抖音右滑清屏,左滑列表功能

热门文章

  1. 砝码称重(枚举and动态规划)
  2. 金融项目经验之代码安全
  3. “果粉”速递:简单9步轻松绕过iCloud 激活锁
  4. android 分享微信 不审核,ShareSDK Android 微信分享 绕过审核与不绕过审核
  5. 野火STM32学习笔记
  6. 【Pandas】筛选某列过滤
  7. 微型计算机点火系统有分电器,汽车发动机点火系统,微机控制点火系统的类型与组织,你知道多少...
  8. 微软发布文件恢复程序,超好用(附下载地址)
  9. C#操作xml文档,cuid,dategridview显示数据
  10. surface pro 开发java_微软 Surface Pro、Studio、Laptop 全线更新