新闻资讯
看你所看,想你所想

字元串赋值

字元串赋值

字元串主要用于编程,概念说明、函式解释、用法详述见正文,这里补充一点:字元串在存储上类似字元数组,所以它每一位的单个元素都是可以提取的,如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++这样就是不合法的,即不能进行数学运算,也不能使用*取值操作,想使用必须转换为其它的类型。

相关推荐

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:yongganaa@126.com