字符串
2018-06-18 04:19:26来源:未知 阅读 ()
字符串:是以空字符\0为结尾的char数组
在程序中定义字符串的方法
1.字符串常量(字符串文字):是指位于一对双引号中的任何字符,双引号里的字符加上编译器自动提供的结束标志\0字符,作为一个字符串背储存在内存里。它常常用作printf和puts的参数。
2.字符串数组:定义一个字符串数组时,必须让编译器知道它需要多大的空间。一种方法是指定以一个足够大的数组来容纳字符串,而通常,让编译器决定数组大小更为方便。(在进行初始化声明时如果省略了数组大小,则其大小由编译器决定)。
常见的定义字符串的方法
①#define MSG "this is a string"
②char msg[50] = "this is a string"; char msg[] = "this is a string";
const char msg[50] = "this is a string"; const char msg[] = "this is a string";
③char *msg = "this is a string"; const char *msg = "this is a string";
④char *msg[3] = {"this is the first string","this is the second string","this is the third string"};
const char *msg[3] = {"this is the first string","this is the second string","this is the third string"};
字符串常量属于静态存储类,即使多次使用了字符串常量,该字符串在程序的整个运行过程中只存储一份。整个引号中的内容作为指向该字符串存储位置的指针。这一点与把数组名作为指向数组存储位置的指针类似,即把字符串看作指针。
例如:对于字符串“We are the champion”,
若在printf中用%s输出,则输出引号中所有内容,即“We are the champion”。
若以%p输出,则输出的使字符串中第一个字符的地址,此处即'W'的地址。
若以%c输出*”We are the champion“,则输出字符串“We are the champion”中的第一个字符,此处即W。因为“We are the champion”是地址,等于该字符串第一个字符(W)的地址,故*“We are the champion”的值即为该地址中的值,即W。
比较char *msg和char msg[]
在数组形式中,msg是个地址常量。您不能更改msg,因为这意味着更改数组存储的位置(地址)。
可以实用msg+1来表示数组里的下一个元素(==msg[1]),但是不允许实用++msg或msg++,因为增量运算符只能用在变量名前,而此处msg使个地址常量。
在指针形式中,msg指向字符串的第一个字符,它的值使可以变的。因此可以对他使用增量运算符。例如,++msg将指向第二个字符。
总之,数组初始化是从静态存储区把要给字符串复制给数组,而指针初始化只是赋值字符串的地址(==字符串第一个字符的地址)。
比较char *msg[SIZE]和char (*msg)[SIZE]
表达式中[]的优先级高于*,因此圆括号的有无会造成很大不同。
char *msg[SIZE]表示msg是一个包含SIZE个元素的数组,而数组中的每个元素都是一个指向char值的指针。该种形式可以用来声明一个字符串数组。
msg数组中存放的是字符串的地址,而实际上字符串存在于程序用来存放常量的那部分内存中。可以把msg[0]看作指向第一个字符串开始的指针,*msg[0]表示第一个字符串的第一个字符,由于数组符号和指针之间的关系,它等价于msg[0][0],尽管msg并没有被定义成二维数组
char (*msg)[SIZE]表示msg首先是一个指针,它指向的是一个包含SIZE个char值的数组,该种形式可以用来声明指向二维数组的指针变量。
字符串的输入
如果想把字符串读到程序中,必须首先预留存储字符串的空间,然后使用输入函数来获取这个字符串。
创建存储空间的方法
1.利用char数组,需要分配足够大的存储区来存放希望读入的字符串,需要在声明中明确指出数组大小。例如,char msg[50];
2.利用C库里分配存储空间的函数。例如,char *ptd; ptd = (char *) malloc (SIZE * sizeof(char));这段代码请求SIZE个char类型值的空间,并且把ptd指向该空间所在位置。
输入函数
gets()函数,它读取换行符之前(不包括换行符)所有字符,在这些字符后添加一个空字符\0,然后把这个字符串交给调用它的程序。它使用一个地址作为参数,可以使数组名,也可以是初始化过的(已分配内存的)指针。如果遇到文件结尾,gets就返回空指针NULL。
注意,gets不检查目标数组是否能够容纳输入!常见形式为:char name[50]; gets(name);
fgets()函数,它需要您指定最大输入字符数和读哪个文件(键盘为stdin)。如果这个参数值为n,fgets就会读取最多n-1个字符或者读完一个换行符为止,由这二者中最先满足的那个来结束输入。它读取到换行符,不会像gets那样丢弃,而是存储到字符串里。常见形式:char name[50]; fgets(name,50,stdin);
scanf()函数,更基于获取单词而不是字符串。它以%s格式读取,以遇到的第一个非空白字符开始,读到(但不包括)下一个空白字符。如果指定了字段宽度如%10s,则会读取10个字符或者直到遇到第一个空白字符,由二者中最先满足的那个中只输入。常见形式:char name[50]; scanf("%s",name);
输出函数
puts()函数,其参数为字符串的地址,它会在显示字符串时自动在其后添加一个换行符。
常见形式:puts(name); puts("this is a string!");
fputs()函数,它是puts面向文件版本,需要第二个参数来说明要写的文件,且fputs不为输出自动添加换行符。
常见格式:fputs(name,stdout);
printf()函数,它没有puts那么方便,但是它可以格式化多种数据类型,因而更通用。它使得在一行上输出多个字符串变得更为简单。
常见形式:printf("Well,%s %s\n",name,MSG);
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:3DES加解密 C语言
- Z 字形变换 2020-04-14
- 翻转字符串里面的单词 2020-04-10
- 用C++实现:FJ的字符串打印 2020-04-04
- [题记]字符串转换整数-leetcode 2020-04-03
- C++ 字符串输入 2020-03-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash