字元串赋值
字元串主要用于编程,概念说明、函式解释、用法详述见正文,这里补充一点:字元串在存储上类似字元数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefghij”,则s[1]=“a”,s[9]="j",而字元串的零位正是它的长度,如s[0]=10(※上述功能Ansistring没有。),这可以给我们提供很多方便,如高精度运算时每一位都可以转化为数字存入数组。但是字元串赋值有一定要求,例如C语言的运算符根本无法操作字元串。在C语言中把字元串当作数组来处理,因此,对字元串的限制方式和对数组的一样,特别是,它们都不能用C语言的运算符进行複製和比较操作。
基本介绍
- 中文名:字元串赋值
- 外文名:String assignment
- 性质:字元串的赋值方式
- 表现形式:数组或指针
- 套用学科:C语言、C++等程式语言
- 领域:计算机、电信等领域
字元串简介
定义
字元串或串(String)是由数字、字母、下划线组成的一串字元。一般记为 s=“a1a2···an”(n>=0)。它是程式语言中表示文本的数据类型。在程式设计中,字元串(string)为符号或数值的一个连续序列,如符号串(一串字元)或二进制数字串(一串二进制数字)。
通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字元串相等的充要条件是:长度相等,并且各个对应位置上的字元都相等。设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和连结存储方式。
表示方式
正确定义:
char[]={‘c’,’c’,’c’};或char[4]={‘c’,’c’,’c’};
需要注意下列问题:
1.char[]={“cc”};
如果使用这种定义方法,则数组长度必须大于字元串的长度,至少大1。当然也可以不指定数组长度;
例如:
char[3]={“str”}
char[3]=”ccc”;
以上这两种,错误定义,系统会报错,字元溢出。
2.char[3]={‘c’,’c’,’c’};
这种定义方法,系统不会报错,但最后的输出会出现乱码。
常用函式
字元串输入函式:
函式 | 格式 | 功能 |
gets() | gets(字元数组) | 从键盘输入一以回车结束的字元串放入字元数组中, 并自动加'\0' |
scanf() | scanf("%s", 字元数组) | 从键盘输入一以空格或回车结束的字元串放入字元数 组中,并自动加'\0' |
字元串输出函式
函式 | 格式 | 功能 |
puts() | puts(字元串地址) | 向显示器输出字元串(输出完,换行) |
printf() | printf("%s", 字元串地址) | 依次输出字元串中的每个字元直到遇到字元'\0'('\0'不会被输出) |
字元串的长度
函式 | 格式 | 功能 |
strlen() | strlen(字元串地址) | 计算字元串长度,返回字元串实际长度,不包括'\0'在内 |
字元串的複製
函式 | 格式 | 功能 |
strcpy () | strcpy (字元数组1,字元串2) | 将字元串2拷贝到字元数组1中去,返回字元数组1的首地址 |
strncpy () | strncpy (字元数组1, 字元串2, 长度n) | 将字元串1前n个字元的子串与字元串2前n个字元的子串进行比较 |
字元串的比较
函式 | 格式 | 功能 |
strcmp () | strcmp (字元串1, 字元串2) | 比较两个字元串,对两串从左向右逐个字元比较(ASCII码),直到遇到不同字元或'\0'为止 |
stricmp() | stricmp(字元串1, 字元串2) | 同strcmp,stricmp在比较两个字元串时不区分大小写,而strcmp则区分大小写 |
strncmp () | strncmp (字元串1, 字元串2, 长度n) | 将字元串1前n个字元的子串与字元串2前n个字元的子串进行比较 |
上述为几种常见的字元串的函式。
字元串赋值方式
C语言中,字元串的表现形式有两种:一种是以字元数组的形式,如char str[20]="I love china";另一种是以字元指针的形式,如char *str="I love china"。字元串可以赋值给字元指针变数,或者将字元串用字元数组保存。因为c语言没有直接对字元串提供语法糖方面的支持。而且C标準库很多方法处理字元串是以空字元结尾为前提的,这个必须要记住。
char *p,a='5';p=&a; //显然是正确的,p="abcd"; //但为什幺也可以这样赋值??
在如上程式中,双引号做了3件事:申请了空间(在常量区),存放了字元串 ;在字元串尾加上了’/0’ ;返回地址。这里就是把返回的地址赋值给了p。
但是char *p = “hello”;表达式为什幺可以,而把p换成数组,然后再赋值就不行了。这是因为字元串常量”hello”出现在一个表达式中时,”hello”表达式使用的值就是这些字元所存储的地址(在常量区),而不是这些字元本身。所以,可以把字元串赋值给指向字元的指针p,而不能把字元串赋值给一个字元数组。char a[10] = “hello”; 这样也是可以的,这种情况是c语言初始化所支持的。如果写成char a[10]然后 a = “hello” 这样就错误了。同样是a数组,char a[10] = “hello”;这种是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理。但是换成char a [10],然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。
我们来测试一下:
#include <stdio.h> int main(){ char *p = "hello"; printf("%s",p); char a[10]; a = "hello"; return 0;}error C2440: '=' : cannot convert from 'char [6]' to 'char [10]' There is no context in which this conversion is possible
看到这样的错误提示,试一下把char a[10]改成char a[6]
error C2106: ‘=’ : left operand must be l-value
运算符的左边应该是一个“左值”。所谓“左值”就是指在程式中占用记忆体空间、可以被修改的量,比如各种变数。
在使用指针的时候,指针可以自增,而数组名不能自增编译器给数组分配了空间,数组a的地址就表示一个常量了,让常量自增这肯定是不行的。
同时,在指针自增的时候,编译器会自动识别类型,比如指针是指向int型的,想获取下一个的地址时,指针直接p++就行了,不要多此一举的p+4了。
需要注意的是,在void指针使用的时候,不能使用指针运算,因为void型编译器不能识别类型的长度(即指针所指对象的体积),p++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型。