您的位置 首页 资料

C语言中字符串与字符数组剖析

字符串并不是C语言中默认存在的类型,但是由于字符串的实用性,在谭浩强C语言中有对字符串的一些描述,但是不是特别的详细。有时候写代码时

字符串并不是C言语中默许存在的类型,可是由于字符串的实用性,在谭浩强C言语中有对字符串的一些描绘,可是不是特别的具体。有时分写代码时都不会留意到一些小细节,本文就结合试验剖析一下字符串与字符数组之间的不同。

字符串与字符数组的差异在曩昔我一直是处于一知半解的状况,字符串是一般被以为是常量,是保存在一段固定的内存中的,这段内存是以为结束符,这段内存一般只能经过一个指针来找到。字符数组其实和其他数组没什么差异,仅仅保存的数据类型是字符类型(char),它没有强制要求最终的元素是否是。字符数组的数组名是指向第0个字符的指针,而不是指向这个字符串的。这与我前期博客中对数组的剖析结论是相同的,数组名并不像指针存在一个地址来保存指针名,数组名能够看做是汇编程序中的一个标号,并没有专门的地址来保存数组名。

可是字符串和字符数组又有许多类似的当地,特别是当咱们结合指针操作字符数组时分,就会导致过错的发生,我觉得只要搞清楚一些概念就能较好的防止这种过错的发生。这个概念便是指针便是指针,数组便是数组,两个搞混仅仅由于某些偶然使咱们误以为指针和数组是等值的。两者实质上是不相同的。

字符数组和字符串的界说如下:

1. //字符串

2. char *str = “string is a constant”;

3. //字符数组

4. char strarray[] = {s,t,r,i,n,g, ,i,s, ,a, ,c,o,n,s,t,a,n,t,};

5. //或许

6. char strarray[] = “string is a constant”;

7. char strarray[] = {“string is a constant”};

其间从上面的界说能够知道字符串实质上一块内存,其间保存的值是常量,常量其实便是不能选用程序对内存中的值进行修正,当然仅仅程序不能,我以为就像嵌入式C言语中的const类型相同,尽管咱们一般以为这个变量是常量,但实质上是只读性变量,仅仅不能经过程序修正,还能够经过其他的方法修正。这时分str指向的内存空间中保存的数据是不能被程序修正的,也只能经过str指针对这段内存进行拜访。

假如字符数组界说成单个的字符,咱们或许还能较好的别离,但假如是如第二种界说、第三种方法界说,咱们或许就会发生很大的不理解,这与字符串的类型基本上没有什么不同,仅仅多了一个数组符号[ ],可是这个数组符号就意味着数据类型的改动,咱们能够知道数组中的值是能够改动的,不是常量,阐明strarray是一个数组变量,而str却是一个字符串常量指针。Strarray是一个标号,存储器中并没有专门分配内存空间存储strarray的值。可是指针和数组名许多时分的一些类似性使得咱们在处理的时分很难去判别,比方下面这段代码:

char * str = “Constant String”;
char strarray[] = “Constant String”;

int str_len,size_str,array_len,size_array;

str_len = strlen(str);
array_len = strlen(strarray);
size_str = sizeof(str);
size_array = sizeof(strarray);
size_str = sizeof(*str);

假如知道其间的一些数组与指针的一些差异能够较好的得到这些值,首要strlen(str)是指求解字符串的长度,可是不包括,因而str_len便是字符串的长度,也便是str_len = 15,array_len也是求解字符串长度的值,咱们前面现已指出数组和字符串存在不同,但为什么还能够这样做呢。咱们暂时以为包括的字符数组能够看做是字符串或许伪字符串,两者十分的类似,都是存在一段内存,保存一段数据,格局也十分的类似,所以strlen以为两者是相同的,但实质上仍是存在不同的,可是选用strlen求解字符串长度时,array_len和str_len 是相同的。
size_str 和size_array这两个变量的值是我写这篇文章的初衷,由于我之前底子没有起剖析其间的一些不同,天经地义的以为两者是相同的,但细细比较发现两者的确存在问题。size_str = sizeof(str)的值是多少?sizeof是指对变量或许类型求解存储空间,是C言语中不被注重的关键字,被大多数人以为是一个函数,实质上是一个关键字。这样咱们就能比较快速的确认后边三个变量的值啦,size_str = sizeof(str)是指对str的存储器长度进行核算,str是一个字符型指针,咱们知道,指针类型的变量实质上便是一个地址,在32机中,地址一般需求4个字节的内存空间来存储,因而,size_str = 4;知道了sizeof的含义,size_array就比较简略了,strarray是一个数组变量,是一段内存空间的标明,sizeof(strarray)是指上便是求解数组的内存巨细,这时分的内存巨细包括,因而size_array的值应该是15+1=16。而接下来的size_str = sizeof(*str)就愈加简略了,由于咱们知道关于字符串指针而言,指向的仅仅字符串的第0个元素,而不是整个字符串,这时分又会和数组的数组名有必定的穿插,数组的数组名咱们一般被以为是一个常量指针(左值右值的不同),也便是指向的开始地址是不变的,可是一般被以为是指向数组首个元素的常指针,不能进行++,–操作。接着阐明sizeof(*str),*str是指指向字符串的第0个元素的指针的值,也便是说*str是指上便是字符串的第0个元素,也便是一个字符类型,字符类型的巨细也便是1字节了,因而这时分的size_str = 1。
上面的剖析阐明晰在字符串和数组的相关操作中运用strlen的安全性总是比sizeof好,特别是不清楚sizeof的一些含义的情况下。

经过上面的剖析咱们应该字符串和字符数组仍是存在许多不同的,可是仅仅理论上的剖析,接下来选用程序进行测验。这个程序首要检测字符串是否为常量,而字符数组是能够修正的。

#include
#include
#include

#define BUFS 20

int main()
{
char s[] = {“This is just a test!!”};
char d[] = {“Hello String strncpy!!”};

char *str = “String constant!”;
char *str1 = “Testing!!”;

/*不能选用界说指针的情况下就进行字符串的操作,
*需求分配必定长度的空间,
*由于没有内存空间不能操作
*/
char *p = malloc(BUFS * sizeof(char));

/*修正字符数组*/
strncpy(p,s,strlen(s));
printf(“p = %s”,p);
printf(“d = %s”,d);
strncpy(d,s,strlen(s));
printf(“d = %s”,d);
strncpy(d,s,strlen(d));
printf(“d = %s”,d);

/*修正字符串*/
printf(“Test the string constant”);
printf(“Constant String str = %s”,str);

strncpy(str,d,strlen(str));
printf(“p = %s”,p);
printf(“d = %s”,d);
strncpy(d,s,strlen(s));
printf(“d = %s”,d);
strncpy(d,s,strlen(d));
printf(“d = %s”,d);

/*修正字符串*/
printf(“Test the string constant”);
printf(“Constant String str = %s”,str);

strncpy(str,d,strlen(str));
printf(“Constant String str = %s”,str);

return 0;
}

编译今后呈现的作用如下:

[gong@Gong-Computer c_languange]$ gcc -g strncpytest.c -o strncpytest
[gong@Gong-Computer c_languange]$ ./strncpytest
p = This is just a
d = Hello String
d = This is just a
d = This is just a
Test the string constant
Constant String str = String
Segmentation fault (core dumped)

结合上面的代码能够知道关于字符数组的操作都顺畅的完结了,可是字符串的修正却没有正常的完结,呈现了
反常(Segmentation fault (core dumped)),实质上便是由于字符串是不能修正的,导致了问题的抛出。据说在ANSI C中规则对字符串的操作会导致不确认的成果,这也阐明晰字符串是不能进行修正的。

经过上面的剖析,数组和指针仍是存在十分大的不同的,在字符串的操作过程中这种不同愈加的显着,因而在实践写代码的过程中要不时留意这些小的不同,只要铭记一些概念才干真实的写好代码。

总结:

字符串是一个常量,不该该被修正,修正会呈现过错,字符数组能够进行修正,由于数组中的值并不是不变的。在关于字符串的操作中,最好是选用首要将字符串赋值给字符数组,然后经过指针的方法拜访进行修正等相关操作,而不能直接对字符串指针进行修正操作。

数组是一段内存的标明,指针仅仅保存了一个地址值。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/317739.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部