C语言中的字符串

原创
2016/10/22 19:28
阅读数 146

1.字符串与字符数组

字符数组是一种数组,这中数组中的每个元素是一个字符型数据。

定义一个字符数组:

char ch[5];

对已定义的字符数组进行赋值:

ch[0] = 'h';
ch[1] = 'e';
ch[2] = 'l';
ch[3] = 'l';
ch[4] = 'o';

以上字符素组的存储为:

字符数组的初始化有两种方式:

char ch[5] = {'h','e','l','l','o'};
或者
char ch[] = {'h','e','l','l','o'};

字符串与字符数组的区别在于,字符串在有效的字符后面添加一个结束标志‘\0’。

'\0'字符的ASCII码是0,系统在检测到该字符的时候就认为字符串已经结束了。

#include <stdio.h>

int main(void)
{
  char ch[] = {'h','e','l','l','o','\0'}; //字符串初始化
  printf("%s\n", ch);
  ch[3] = '\0';  //将第4个元素改成结束符
  printf("%s\n", ch);
  return 0;
}

运行结果为:

上面的实例说明,printf()函数在打印字符串的时候并不检测字符数组的大小,而是检测需要打印的字符串是否有'\0'的结束标志。C语言中和字符串有关的库函数都是以遇到'\0'为字符串操作结束标志的。

对一个字符串的初始化有两种方式:

char str[] = {"hello"};
或
char str[] = “hello”;

需要注意的是字符串会添加一个结束符'\0'在字符串的结尾。

2.字符串与指针

在C语言中使用两个双引号括起来的内容是一个字符串的常量,如下:

char *p = "hello world";

由于一个字符串常量的值本身不会改变,因此这种字符串常量存储在一个只读的数据段中,任何尝试对该数据段的修改都是不允许的,也可以使用下面的方式定义字符串:

char str[] = "hello";

这种字符串是可以修改的,这种定义实际上将存储在制度数据段中的字符串的内容复制到了字符数组的空间中,因此这种方式等价于:

char *p = "hello";
char str[6];
strcpy(str, p);

来看下面的程序:

#include <stdio.h>

int main(void)
{
  char *str1 = "hello";  //字符串
  char str2[] = "hello"; //字符数组
  char *str3 = "hello";  //字符串
  if(str1 == str2)
    printf("1 OK\n");
  if(str1 == str3)
    printf("2 OK\n");
  
  return 0;
}

运行结果为:

原因是str1和str3指向同一个字符串常量,而该常量存储在只读数据段中,这时两个指针实际上指向同一块内存区域,因此指针的值是相等的。

而对于str2和str1来说,所指向的存储空间的位置是不同的。str2是一个数组名,该数组存储在栈上。而str1所指向的空间存储在只读数据段上,由此可知两个指针谁不相等的。

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部