Windows下VB6.0开发——关于String类型数据的思考

前言:之前做工程时候出现了打不开VB工程或者EXE文件打开就闪退的现象,最后一步步调试发现是程序出错。出错的地方竟然是一个小小的String类型数据处理引起的,记录下来。


1. 字符数组和字符串

1.1 字符数组和字符串的存储区别

  C语言中不管是字符数组还是字符串,都是一系列的字符有序存储在一块连续的内存当中。二者最大的区别是字符串的末尾多了'\0'作为字符串的终止符。比如对于一块连续的char类型内存存储:'a' 'p' 'p' 'l' 'e'就是一个字符数组;'a' 'p' 'p' 'l' 'e' '\0'就是一个字符串。

1.2 字符串常量和字符串变量

  • 字符串常量
      对于一个字符串常量来说,在程序运行前它的大小已经被固定且内容可知,所以它会被存储在静态存储区,只要取它的地址且不需要知道它的长度,就可以读出整个字符串(因为有字符串结束符'\0')。但是不能使用这个字符串地址对字符串常量进行字符改变。即
  • 字符串变量
      对于一个字符串变量来说,其内容长度经常有可能改变,所以在对字符串变量进行声明时必须给其分配一个地址以及连续的存储单元(即长度)。

1.2 char[ ] 和 char *

  char []char *是字符串数组和字符指针的区别,我们在使用二者去声明一个跟字符相关的数据时需要特别注意一点:字符串内容是否可变。

  • char[ ]
      对于char [ ]来说(这里只考虑最普通的情况,不考虑前面加const声明的情况),它可以改变数组元素的内容,所以它适合用来声明字符串变量,有以下声明:
char a[10] = {
    
    'a','p','p'};  
char b[10] = {
    
    'a','p','p','\0'};  
char c[] = "app";

  a是一个字符数组,b是一个字符串,c是一个长度为4的字符串数组。他们都能通过数组首地址和索引改变字符内容。

  • char *
      char *是一个字符指针,它可以用来声明字符串变量和常量,用%s可以打印输出整个字符串。
char a[3];
char *b = a;
char *c = "app";

  字符串指针b可以指向一个字符数组a,此时可以通过该指针来操作一个字符变量,读写操作都行。字符串指针C指向一个字符串常量地址,它只能进行读操作而不能进行写操作改变字符串内容

  • 例题:
    以下不正确的字符串赋值语句是
    A、 char *s; s=“abcde”;
    B、 char s[ ]=“abcde”;
    C、 char s[10]; s=“abcde”;
    D、 char *s=“abcde”;

  答案应该选择C,A和D本质上是同一种做法,字符指针S,指向了一个字符串常量"abcde"的静态存储区地址。B选项不是指针指向,而是将字符串常量”abcde“的内容复制到数组s中,选项C和B比较,它错误的地方是S是数组首地址指针,它是一个指针常量,即它不能改变它指向的地址却可以改变指向地址的内容。所以它不能改变自己的指向,指向一个字符串常量地址。


2. 字符存储类型String

  对于在绝大多数面向对象的高级语言过程中出现的String类型,我更倾向于把它简单看作char *char [ ]的结合体。String类型返回一个字符地址用于读取和操作字符串,它同时也具备char[ ]可扩展的特性。
  但在用于字符串变量可扩展操作时,必须先给String分配内存空间,比如在VB中,下面这种对GL_version的操作会引起错误,因为没有给String数据类型分配内存空间:

Dim GL_version As String 
getErrNum = GetPrivateProfileString("option", "version", "未定义", GL_version, 5, ".\PARAINIT.ini") '版本

而当给String数据类型分配空间后,能正常运行。

Dim GL_version As String 
GL_version = String(10, 0) '字符数组
getErrNum = GetPrivateProfileString("option", "version", "未定义", GL_version, 5, ".\PARAINIT_006.ini") '版本

猜你喜欢

转载自blog.csdn.net/qq_36749906/article/details/110110981