cfmonkey的笔记本

zt HowTo 初始化大型字符数组

HOW TO:初始化大型字符数组

 

本页

概要

方法 1 -- 字符串

方法 2 -- 字符初始值设定项

方法 3 -- 多维数组

方法 4 -- 程序集模块

方法 5 -- 从文件中读取

概要

C 编程的一个常见问题是初始化大型字符数组。 有几种初始化方法,但也存在一些潜在问题。

方法 1 -- 字符串
初始化字符数组的方法之一是使用字符串。 字符串连接后 ANSI 所允许的最小限制为 509 个字符。 在以前的 Microsoft C/C++ 版本中,根据编译器的版本,该限值在 512 到 2048 之间。 由于受字符串长度的限制,不能使用这种方法来初始化长度大于该限值的字符数组。 (这些限值包括 C "字符串" 的结束空字符。 因此,语句 char a[] = "12"; 的结果是一个 3 元素的数组。)

因为在大多数编辑器中还对行长度进行限制,所以通常不能直接将多个字符放在一个字符串中。 编译器将一系列用引号引起的字符串连接为单个字符串,因此,声明
char a[] = "a"
           "b";
与以下声明相同:
char a[] = "ab";
这允许将较大的初始值设定项放在代码中(如下所示)。 这种方法仅限在编译器限值之内使用。
char stuff[] =
   "xxx...xxx"
       ...
   "xxx...xxx";
(ANSI 标准规定将自动连接仅以空格分隔的字符串。)

 

方法 2 -- 字符初始值设定项
可以使用以下语句:
char stuff [] =
   { 'a', ...
          ...
     ... 'z' };
但是,键入此类初始值设定项是很繁琐的事。 如果使用这种方法,请编写一个程序来读取某个数据文件,并输出正确的初始值设定项。

 

方法 3 -- 多维数组
char stuff[][10] =  {
   "0123456789",
   ...
   "0123456789"  };
值 10 不是重要的 EXCEPT,它必须与字符串常量的实际长度匹配。 如果任何常量都比指定的长度短,则使用零字节填充该行的结尾。 如果任何常量都比指定的长度长,则去掉多余的字符。 这将产生两个多维数组。 对于指定的几乎任何一种方法,都可以使用另一个指针访问以下内容:
   char *stuffptr = (char *) stuff;
这种方法似乎是最简便的。 使用一个指针以及将数组作为单个多维数组来处理的一个严重问题是:计算多余的空字符的个数非常困难,尤其当所有初始值设定项字符串长度并不相等时,更是如此。 因此,除非仔细地计算个数,否则 stuffptr[97] 可能并不访问预期的元素。

 

方法 4 -- 程序集模块
也可以在 MASM 中定义数组并将数组链接到 C 程序上。 在 MASM 中,当正确的段和公共定义完成后,编写以下内容:
stuff   db      "abcdefghijkl"
        db      "morestuff"
        ...
        db      "laststuff"
在 C 中,使用以下语句访问数组:
extern char stuff[];   /*    char * stuff;   will NOT work    */ 

 

方法 5 -- 从文件中读取
另一种方法是在运行时将值从数据文件读取到数组中。 如果以大块形式读取文件(例如,使用 read 或 fread),则 I/O 速度很快。 此方法还具有以下优点:可以更改初始化字符串,而无需更改和重新编译代码。

 


posted on 2007-06-17 02:17 cfmonkey 阅读(655) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿(2)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜