在数组中编辑定长字符串
以下代码实现了在数组中存储、查询、删除字符串功能,存储的每个字符串最长长度为9(不包含字符串结束符/0)。
新增用户输入字符串时,依次扫描以10字节为基数的数组空间,如果标志位为1,说明是有效字符,直到找到标志位为0的空间,然后存储。
删除一个字符串之后,此字符串存放空间释放(标志置为0),可以存入用户输入的新字符串。
查询字符串时,标志为1则显示,标志位为0则为已删除的无效字符串,不显示。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 存储字符串的数组总长度
#define CSTRSPACE (10000)
// 存储标志位的数组总长度
#define NFLAGLEN ((CSTRSPACE) / (10))
void addString(char *pcStr, int *pnFlag);
void delString(char *pcStr, int *pnFlag);
void searchString(char *pcStr, int *pnFlag);
int main()
{
char cStr[CSTRSPACE] = {0};
int nFlag[NFLAGLEN] = {0};
char *pcStr = cStr;
int *pnFlag = nFlag;
int nUserChoose = 0;
while(1)
{
printf("1. Add string/t/t2. Delete string/r/n"
"3. Search string/t0. Exit/r/n");
printf("please input a number:/r/n/r/n");
nUserChoose = 0;
scanf("%d", &nUserChoose);
if (nUserChoose != 0 && nUserChoose != 1
&& nUserChoose != 2 && nUserChoose != 3)
{
printf("Wrong choose!/r/n/r/n");
}
if (0 == nUserChoose)
{
break;
}
switch(nUserChoose)
{
case 1: addString(pcStr, pnFlag);
break;
case 2: delString(pcStr, pnFlag);
break;
case 3: searchString(pcStr, pnFlag);
break;
}
}
system("pause");
return 0;
}
// 添加字符串
void addString(char *pcStr, int *pnFlag)
{
int i = 0;
printf("please input a string:/r/n");
for (i = 0; i < NFLAGLEN; i++)
{
if (*(pnFlag + i) == 0)
{
scanf("%9s", (pcStr + i * 10));
fflush(stdin);
printf("add succeed!/r/n/r/n");
*(pnFlag + i) = 1;
break;
}
}
if (NFLAGLEN == i)
{
printf("No Space!/r/n");
}
}
// 删除字符串 www.2cto.com
void delString(char *pcStr, int *pnFlag)
{
int i = 0;
searchString(pcStr, pnFlag);
printf("please input a number:/r/n");
scanf("%d", &i);
// 数据未清空,只是将标志位置为0
*(pnFlag + i) = 0;
printf("delete succeed!/r/n");
}
// 查询所有字符串
void searchString(char *pcStr, int *pnFlag)
{
int i = 0;
printf("/r/n");
for (i = 0; i < NFLAGLEN; i++)
{
//标志位为1则显示
if (*(pnFlag + i) == 1)
{
printf("%d:/t%s/r/n", i, (pcStr + i * 10));
}
}
printf("/r/n");
}
PS:存储定长字符串相对来说实现起来简单一些,如果存储长度不确定,在删除字符串后又有新增字符串的话,需要检查被删除字符串的空间能否存储的下新增字符串。如果不能,需要找下一个存储空间。还有一种情况,所有连续的空间都不够存储用户输入的长字符串的话,可以分拆存储,但是分拆存储后查询显示时需要重新拼接。或者将数组内已存储的字符串都移位,将已删除的字符串空间给挤出来,这样连续的空间就会变长。此种情况跟磁盘碎片整体有相似之处。这部分,等写出来后再贴出来吧。
首先在数组里玩玩数组,以后换个存储介质,比如硬盘啊之类的,应该会轻松很多,只是换了几个功能函数而已。
摘自 Elijah Wong