- 字符串数组
上一篇简单介绍指针数组,这篇介绍指针数组更复杂的应用——字符串数组。指针数组可以用来构造字符串数组,数组的每一个元素都是一个字符串。在C语言中,一个字符串本质上是指向其第一个字符元素的指针,因此字符串数组的每个元素本质上就是指向某个字符串第一个字符的指针。
比如,可将扑克牌花色名的字符串数组suit定义为
const char* suit[4] = {
"Hearts","Diamonds","Clubs","Spades" };
解释:suit[4]
表示这是一个有4个元素的数组,char*
表示数组suit每个元素类型都是字符指针型,由const
修饰的指针变量表示所指向的字符串是不可以被修改的。存放在数组中的四个值分别是"Hearts", "Diamonds", "Clubs", "Spades"
。表面上来看,这些字符串是存放在数组suit
中,实际上,数组只存放指针,每个指针指向相应字符串的第一个字符(如图1)。因此,即使数组suit
大小是固定的,也能访问任意长度的字符串。
图1 数组suit的图形表示
2.用双下标数组表示一副扑克牌
我们使用4*13的双下标数组deck来表示一副扑克牌(如图2)。数组的一行对应一种花色,行0表示红桃(Hearts),行1表示方块(Diamonds),行2表示梅花(Clubs),行3表示黑桃(Spades)。数组的一列对应一个牌面值,列0到列9依次对应A到10,列10到列12分别对应Jack,Queen,King。
我们还要使用字符串数组suit和字符串数组face来分别存储表示花色名的四个字符串和表示牌面值的13个字符串。
图2 扑克牌的双下标表示图
3.针对双下标数组的洗牌
下面是模拟扑克牌洗牌的算法。首先将数组deck清零,然后随机地产生一个行号row(0~~~3)和一个列号col(0~12),并将1(牌的顺序号)写入数组元素deck[row][col],以表示这是洗牌后的第1张扑克牌。重复以上过程,依次将2、3、…52随机地写入数组deck中,表示洗牌后的第2、3…52张扑克牌。在将牌的顺序号写入数组deck的过程中,可能会出现一张牌被选中两次的情况一即选中的deck[row][col]的值已为非0值。这时就忽略掉这次选择,再一次随机地产生行号和列号,直到发现一张没有被选中过的牌(即deck[row][col]的值等于 0)为止。最后,1~ 52这些数占据了数组deck中的52个位置。这时,扑克牌就全部洗完了。
4.基于双下标数组的发牌
为了发第一张牌, 要在数组中搜索deck[row][col]值为1的元素。这用一个嵌套的for循环语句来实现,其中row(行)由0变化到3, col(列) 由0变化到12。
由于事先已经将四种花色存入数组suit中,所以若要得到这张牌的花色,直接打印字符串suit[row]即可。 同理,若要得到这张牌的面值,打印字符串face[col]即可。另外还要打印字符串"of"。在按适当的顺序打印出上述信息后,我们就能像"King of Clubs"、 "Ace of Diamonds"等这样发好的牌了。
5.程序