C语言字符串 转载来和大家分享
来源:互联网 发布:网络直播平台 编辑:程序博客网 时间:2024/06/03 12:45
总结一下C语言中字符串的处理,一则作为笔记,二则作为技术交流和大家分享。
- 字符串字面量(字符串常量,在C标准中称为,字符串字面量)
如何存储字符串字面量
从本质上而言,C语言把字符串字面量作为字符数组来处理。当C语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间,在末尾增加一个额外的字符——空字符(/0)。
字符串字面量的操作
通常情况下可以在任何C语言允许使用 char * 指针的地方使用字符串字面量。如:这个赋值操作不是复制 "abc" 中的字符,而仅仅是使 p 指向字符串的第一个字符。char *p;
p = "abc"; - 字符串变量
一些编程语言为声明字符串提供了特殊的 string 类型。C语言采取了不同的方式:只要保证字符串是以空字符串结尾的,任何一维的字符数组都可以用来存储字符串。如果编写自己的字符串处理函数,请千万注意要正确地处理空字符。
假设需要变量用来存储最多80个字符的字符串。既然字符串会在末尾处需要空字符,那么要声明的变量是含有81个字符的数组。对宏加一的这种方法是C程序员常用的方式。#define STR_LEN 80
/* 惯用法 */
char str[STR_LEN + 1];
初始化字符串变量date1: | J | u | n | e | | 1 | 4 | /0 |char date1[8] = "June 14";date2: | J | u | n | e | | 1 | 4 | /0 | /0 |char date2[9] = "June 14";
大体上来说,这种行为与C语言处理数组初始化的方法一致。
字符串变量的声明可以忽略它的长度。这种情况下,编译器会自动计算长度:编译器为date3分配8个字符的空间。char date3[] = "June 14";
字符数组与字符指针
一起来比较一下下面两个声明:它声明date是个字符数组。和这个声明相似的是下面这个声明:char date[] = "June 14";它声明date是个指向字符串字面量的指针。char *date = "June 14";
[注意],不能错误地认为上面两种date可以互换。两者之间有着显著的差异:
(1) 在声明为数组时,就像任意数组元素一样,可以修改存储在date中的字符。在声明为指针时,date指向字符串字面量。
(2) 在声明为数组时,date是数组名。在声明为指针时,date是变量,这个变量可以在程序执行期间指向其他字符串。
如果需要可以修改的字符串,那么就要建立字符数组来存储字符串。这时声明指针变量是不够的。下面的声明使编译器为指针变量分配了足够的内存空间:可惜的是,它不为字符串分配空间。在使用p作为字符串之前,必须把p指向字符串数组。一种可能是把p指向已经存在的字符串变量:char *p;char str[STR_LEN + 1], *p;
p = str; 字符串的读写
3.1 用 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 weC函数库还提供puts函数。
puts(str);3.2 用 scanf 函数和 gets 函数读字符串
在 scanf 函数调用中,不需要在 str 前添加运算符 &。因为 str 是数组名,编译器会自动把它当作指针来处理。调用时,scanf 函数会跳过空白字符,然后读入字符,并且把读入的字符存储到 str 中,知道遇到空白字符为止。scanf 函数始终会在字符串末尾存储一个空字符。用 scanf 函数读入字符串永远不会包含空白字符。因此,scanf 函数通常不会读入一整行输入。换行符会使 scanf 函数停止读入,空格符或制表符也会产生同样的效果。可以参考下面的例子:
#include <stdio.h>
#define STR_LEN 80
int main()
{
char str[STR_LEN + 1];
printf("input a string:");
scanf("%s", str);
printf("String inputed is:%s/n", str);
return 0;
}运行结果如下:
为了每次读入一整行输入,可以使用 gets 函数。类似于 scanf 函数,gets 函数把读入的字符放到数组中,然后存储一个空字符。然而,在其他方面 gets 函数有些不同于 scanf 函数:Input a string:this is a string
String is:this(1) gets 函数不会在开始读字符串之前跳过空白字符( scanf 函数会跳过)。
(2) gets 函数会持续读入直到找到换行符才停止(scanf 函数会在任意空白字符处停止)。
此外,gets 函数会忽略掉换行符,而不会把它存储到数组中,用空字符代替换行符。
3.3 逐个字符读字符串
因为 scanf 函数和 gets 函数都有风险且不够灵活,C 程序员经常会编写自己的输入函数。通过每次一个字符的方式来读入字符串。下面是自己编写的读取字符串的函数 read_line():
返回之前,read_line 函数在字符串的末尾放置了一个空字符。就像 scanf 函数和 gets 函数一样,标准函数会自动在输入字符串的末尾放置一个空字符串。然而,如果自己写输入函数,必须要考虑到这一点。int read_line(char str[], 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 */
}
转自Robin_TYUT的csdn:
http://www.cnblogs.com/robin-ty/archive/2010/09/03/1816311.html
- C语言字符串 转载来和大家分享
- 和大家分享C语言中几个知识点
- 收集了一道面试题(字符串翻转),有答案,拿出来和大家分享。
- 免费的C语言和数据结构教学视频(找了很久才找到的好教程,拿出来分享给大家)
- C语言优先级,来分享如何记
- 刚刚收集的图片 来和大家分享 ^_^
- JavScript 的笔记 拿出来和大家分享下
- 怎么使用Banner制作,现在来和大家分享一下
- 一道机试题,拿出来和大家分享一下,稍候贴出我做的代码(C#)
- C语言高手来帮帮我啊.大家加油
- 转载的发现对自己非常有用,来分享给大家
- 用C语言来分割字符串
- 【转载】C语言字符串函数大全
- 资源和大家分享
- 编写密码的c文件(和大家分享)
- 词法分析器 (SNL语言) 自己写的,拿出来大家一起分享,指正
- C语言中字符数组和字符串指针分析(转载)
- 转载的,给大家分享,,希望有用
- java float转byte不丢失精度方法
- stat函数
- Mongodb源码分析--消息(message)
- MAT(Memory Analyzer Tool)工具入门介绍
- WinXP与WinCE串口的运行机制之比较.
- C语言字符串 转载来和大家分享
- 理解数据库范式——通俗易懂 [转]
- 键盘上每个键作用!!! (史上最全的)
- MY 总结:编码字符集,彻底解决JAVA乱码
- jsp里调用属性出错,说没发现属性
- 使用CursorAdapter的注意啦
- C#.Net上传文件大小限制设置
- 改变linux终端颜色[转]------solaris也适用,我已经测试
- C语言中return和exit的区别