前言:之前做工程时候出现了打不开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") '版本

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

  1. Windows下VB6.0开发——VB程序断点调试与顺序执行不一致问题(通信原因)

    前言:这几天手上写的一段VB程序出现了断点调试与顺序执行结果不一致的情况,找问题找了很久,最后发现其实也是个能够注意的小问题,特此记录. 1. 程序架构   本次的实验结构如下,PC端的VB通过串口和 ...

  2. Win10下VB6.0开发之串口通信基础(二)代码功能篇

    MSComm控件串口通信开发 1. MSComm控件的处理流程   MSComm在适当时候引发控件的处理流程主要分为两步: 1)通过事件驱动处理连接端口通信   在收发一个字符或者生一个事件时,不管是 ...

  3. Win10下VB6.0开发之串口通信基础(一)控件属性篇

    前言:VB串口通信的方法一般有两种:一是通过Windows的通信API进行通信:另一种是通过VB的标准控件MSComm来实现.这篇文章要讲的是上位机如何通过VB的串口控件MSComm和下位机进行串口通 ...

  4. Win10下VB6.0开发之错误--无法打开对象窗口和代码窗口

    错误:Win10下使用VB6.0打开一个.vbp文件时,打不开对象窗口和代码窗口 解决办法:找了很久之后才发现,笔者所用笔记本外接了扩展显示屏,在断开外接显示屏连接后,打开VB,再重新外接显示屏即可. ...

  5. Windows10下VB6.0开发——ini文件存储参数信息

    前言:在使用VB编写上位机程序时,想要实现一个功能--每次修改Text文本框中的值后,使得关闭程序后该数值能够保存,在下次打开时可以直接使用.本文介绍了INI文件对该功能的支持. 1.INI文件    ...

  6. Windows10下VB6.0开发——常见控件使用整理

    前言:以下整理了一些常见控件的使用,关于串口通信的控件的使用,在之前文章介绍过. 1. 单选按钮 -- OptionButton   有很多场景中会需要用到单选按钮,使用单选按钮的基本原则是:在同一个 ...

  7. Windows10下VB6.0开发——常用数值处理函数工具

    前言:下面记录整理了VB中经常使用用于数据转换的工具函数. 数值处理 1. 取不大于n的最大整数--Int a = Int(-5.6) '=-6 a = Int(4.88) '=4 2. 四舍五入取整 ...

  8. Windows10下VB6.0开发——常用的字符串处理函数工具

    前言:下面记录整理了VB中经常使用用于字符串转换的工具函数. 字符串处理 1. 获取字符串长度--Len   Len函数中的一个参数是目标字符串,返回目标字符串的长度,例如num = Len(&quo ...

  9. Windows10下VB6.0开发——写入数据到文件操作

    前言:我们在编程中会经常需要将采集到的数据或者设置的参数保存到文件,在此进行VB的文件操作记录. VB保存参数到文件   VB中保存数据到文件的一种操作如下: Dim nHandle As Integ ...

最新文章

  1. ps怎么制作流体_PS实例教程:制作流体质感背景
  2. sklearn中的朴素贝叶斯模型及其应用
  3. moco 搭建接口mock环境入门
  4. 【错误记录】国际化报错 ( “xxx“ is not translated in “zh“ (Chinese) )
  5. filter过滤器_不了解布隆过滤器?一文给你整的明明白白!
  6. 李洪强和你一起学习前端之(8)浮动,网页布局,定位
  7. 我们坚持专业与创新,U can U up
  8. post请求需要加密吗_Python接口自动化Requets之http请求(2)
  9. Robot Framework - Variable file
  10. Vue与jQuery的区别:数据绑定
  11. 如何搞定putty乱码
  12. javaweb学习总结(十一):使用Cookie进行会话管理
  13. BarTender对单个二维码/文本添加多个域(数据库字段)/嵌入的数据,并对数据添加后缀等处理;扩展更多域
  14. 仓库盘点作业流程仓库盘点步骤使用汉码盘点机进行盘点方法
  15. 青龙面板扩展定时任务——九章头条
  16. HNUSTOJ-1621 Picking Cabbage(状态压缩DP)
  17. 天秀!GitHub 硬核项目:动漫生成器让照片秒变手绘日漫风!!!
  18. Marlin固件之二:源代码详解与移植
  19. 从零开始的Linux 阿里云ECS服务器搭建、FileZilla和宝塔
  20. mybatis collection 子查询,嵌套查询,解决分页问题

热门文章

  1. FFmpeg实战命令(不断更新中...)
  2. springboot项目打成可依赖jar包_用IDEA把SpringBoot项目打成jar发布项目
  3. 中点击按钮新建widget_如何在iOS14中创建堆叠小组件?
  4. javassm框架项目实例_面试官:小伙子,给我说一下spring框架吧
  5. 服务器经过交换机传递文件丢失,H3C交换机bin文件丢失后补救方案
  6. mvc jquery ajax分页实例,jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解,mvcpagerajax分页...
  7. Android Studio生成函数注释
  8. keras 升级_如何入门Keras?
  9. php mongodb _id,mongodb php findone()由ID
  10. java利己线程_java利己线程 | 学步园