字符串

2018-06-18 04:19:26来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

 

字符串:是以空字符\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语言

下一篇:Borland C++建立工程菜鸟教程