•字符串字面量(字符串常量,在C标准中称为,字符串字面量)

如何存储字符串字面量
  从本质上而言,C语言把字符串字面量作为字符数组来处理。当C语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间,在末尾增加一个额外的字符——空字符(\0)。

字符串字面量的操作
  通常情况下可以在任何C语言允许使用 char * 指针的地方使用字符串字面量。如:

char *p;p = "abc";这个赋值操作不是复制 "abc" 中的字符,而仅仅是使 p 指向字符串的第一个字符。

•字符串变量
  一些编程语言为声明字符串提供了特殊的 string 类型。C语言采取了不同的方式:只要保证字符串是以空字符串结尾的,任何一维的字符数组都可以用来存储字符串。如果编写自己的字符串处理函数,请千万注意要正确地处理空字符。
  假设需要变量用来存储最多80个字符的字符串。既然字符串会在末尾处需要空字符,那么要声明的变量是含有81个字符的数组。

#define STR_LEN 80/* 惯用法 */char str[STR_LEN + 1];对宏加一的这种方法是C程序员常用的方式。

初始化字符串变量
char date1[8] = "June 14";date1: | J | u |  n | e |   | 1 | 4 | \0 |

char date2[9] = "June 14";date2: | J | u |  n | e |   | 1 | 4 | \0 | \0 |
大体上来说,这种行为与C语言处理数组初始化的方法一致。
字符串变量的声明可以忽略它的长度。这种情况下,编译器会自动计算长度:

char date3[] = "June 14";编译器为date3分配8个字符的空间。
 
字符数组与字符指针
一起来比较一下下面两个声明:

char date[] = "June 14";它声明date是个字符数组。和这个声明相似的是下面这个声明:

char *date = "June 14";它声明date是个指向字符串字面量的指针。
[注意],不能错误地认为上面两种date可以互换。两者之间有着显著的差异:
(1) 在声明为数组时,就像任意数组元素一样,可以修改存储在date中的字符。在声明为指针时,date指向字符串字面量。
(2) 在声明为数组时,date是数组名。在声明为指针时,date是变量,这个变量可以在程序执行期间指向其他字符串。
  如果需要可以修改的字符串,那么就要建立字符数组来存储字符串。这时声明指针变量是不够的。下面的声明使编译器为指针变量分配了足够的内存空间:

char *p;可惜的是,它不为字符串分配空间。在使用p作为字符串之前,必须把p指向字符串数组。一种可能是把p指向已经存在的字符串变量:

char str[STR_LEN + 1], *p;p = str;

现在p指向了str的第一个字符,所以可以把p作为字符串使用了。

字符串的读写

  用 printf 函数和 puts 函数写字符串

  %s 允许 printf 函数写字符串。如:

char str[] = "Are we having fun yet?";printf("Value of str: %s\n", str);如果只显示字符串的一部分,可以用 %.ps。这里的 p 是要显示的字符数量。语句

printf("%.6s\n", str);会显示出

Are we  C函数库还提供puts函数。

puts(str);  

   用 scanf 函数和 gets 函数读字符串

  在 scanf 函数调用中,不需要在 str 前添加运算符 &。因为 str 是数组名,编译器会自动把它当作指针来处理。调用时,scanf 函数会跳过空白字符,然后读入字符,并且把读入的字符存储到 str 中,知道遇到空白字符为止。scanf 函数始终会在字符串末尾存储一个空字符。用 scanf 函数读入字符串永远不会包含空白字符。因此,scanf 函数通常不会读入一整行输入。换行符会使 scanf 函数停止读入,空格符或制表符也会产生同样的效果。可以参考下面的例子:

int read_line(char strp[], int n){    char ch;    int i = 0;    while((ch = getchar()) != '\n')        if(i < n)            str[i++] = ch;    str[i] = '\0';    /* terminates string */    return i;         /* number of characters stored */}

运行结果如下:

Input a string:this is a stringString is:this为了每次读入一整行输入,可以使用 gets 函数。类似于 scanf 函数,gets 函数把读入的字符放到数组中,然后存储一个空字符。然而,在其他方面 gets 函数有些不同于 scanf 函数:

  (1) gets 函数不会在开始读字符串之前跳过空白字符( scanf 函数会跳过)。

  (2) gets 函数会持续读入直到找到换行符才停止(scanf 函数会在任意空白字符处停止)。

  此外,gets 函数会忽略掉换行符,而不会把它存储到数组中,用空字符代替换行符。

  逐个字符读字符串

  因为 scanf 函数和 gets 函数都有风险且不够灵活,C 程序员经常会编写自己的输入函数。通过每次一个字符的方式来读入字符串。下面是自己编写的读取字符串的函数 read_line():

int read_line(char strp[], int n){    char ch;    int i = 0;    while((ch = getchar()) != '\n')        if(i < n)            str[i++] = ch;    str[i] = '\0';    /* terminates string */    return i;         /* number of characters stored */}返回之前,read_line 函数在字符串的末尾放置了一个空字符。就像 scanf 函数和 gets 函数一样,标准函数会自动在输入字符串的末尾放置一个空字符串。然而,如果自己写输入函数,必须要考虑到这一点。

C语言中的字符串处理相关推荐

  1. c语言字符串前加l,【C】 30_C语言中的字符串

    字符串的概念 字符串是有序字符的集合 字符串是程序中的基本元素之一 C 语言中没有字符串的概念 C 语言中通过特殊的字符数组模拟字符串 C 语言中的字符串是以 '\0' 结尾的字符数组 字符串与字符数 ...

  2. python字符串截取方法_如何使用python语言中的字符串方法截取字符串

    在我们使用python语言中的字符串方法时,可能会判断某个字符串是否以什么开头,可以使用什么进行截取等.下面利用几个实例说明字符串中的方法的用法,操作如下: 工具/原料 python 截图工具 方法/ ...

  3. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  4. c语言中用于获取字符串长度的函数是,C语言中求字符串长度的函数的几种实现方法...

    C语言中求字符串长度的函数的几种实现方法 1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { ass ...

  5. c语言中字符串数组应用,C语言中字符变量字符串和字符数组应用.doc

    C语言中字符变量字符串和字符数组应用 字符变量(type`char`?字符串(string)和字符数组(type`char`arrary)是C语言中非常重要的结构成分,也是应用编程中常发生混淆?导致错 ...

  6. c语言字 字符串转换成数组_C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include 总结 以上 ...

  7. c语言中字符怎么表示6,6、C语言中的字符串

    一.C语言中的字符串 字符串是一种重要的数据类型,但是C语言并没有显示的字符串数据类型,不像java有String ,OBC有NSString等等.所以C语言中的字符串一般以字符串常量的形式出现或者存 ...

  8. c 语言输出字符用什么作用是什么,C语言中输出字符串用什么符号

    C语言中输出字符串用双引号. (推荐教程:c语言教程) 详细解读: 在C语言中,有两个函数可以在控制台(显示器)上输出字符串,它们分别是: puts():输出字符串并自动换行,该函数只能输出字符串. ...

  9. C语言中lwr是谁的缩写,C语言中关于字符串的操作(转)

    浅析C语言中关于字符串的操作(转) 前言:如果您是学C/C 的,对于字符串的操作不是很了解,请您耐心读完.作为我的朋友,我很乐意和您分享我最近的知识积累.毕 竟,网上很少有这么全,这么细的介绍,更少有 ...

  10. C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <s ...

最新文章

  1. mysql 命令记录_mysql命令记录 - 我要五个字的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 计算机专业英语霍洪涛出版社,计算机专业英语(霍洪涛)课件Chapter 4.ppt
  3. 爬虫所需准备知识 0221
  4. k-means算法实现python
  5. TensorFlow学习笔记01:TensorFlow入门
  6. c语言用p1口进行转弯灯实验,P1.0口转弯灯程序 单片机IO口的应用
  7. JavaScript 框架库 - jQuery
  8. hdu1426 Sudoku Killer dfs
  9. 安川控制器MP3300与C# 上位机通讯
  10. 骑士人才系统后台用户名密码重设工具源码
  11. 生物信息学:根据PDB名称、爬虫PDB数据库的信息、保存到Excel里
  12. 百度地图导航工具类,包含骑行步行及驾车导航
  13. 五邑大学、广东工业大学教务系统一键评教代码分享及技术简易剖析
  14. 2022-2028全球智能户外电视行业调研及趋势分析报告
  15. 一些面试的SQL题 答案及建表全部齐全!
  16. CSS transform属性的简单应用——双开门动画效果
  17. 坚不可摧!腾讯安全设三道防线,一站式护航云上安全
  18. [通俗易懂] 无线通信读书笔记04(简化路径损耗模型)
  19. 【天池学习赛】淘宝母婴购物数据可视化分析
  20. babel入门文件转译

热门文章

  1. php内置常用函数是哪些,PHP常用函数有哪些
  2. php 前端控制器,前端控制器模式
  3. Python全局解释器锁GIL与多线程
  4. opencv仿射变换
  5. 5. 编程规范和编程安全指南--JavaScript
  6. 深度学习多框架多平台推理引擎工具
  7. 学习《Linux设备模型浅析之驱动篇》笔记(一)
  8. 阿里云rds for mysql平台介绍_阿里云RDS for MySQL实例创建账号和数据库?
  9. Blender 和Unreal Engine中的模块化3D建筑技能学习视频教程
  10. Control Channel Element (CCE)