以下代码实现了在数组中存储、查询、删除字符串功能,存储的每个字符串最长长度为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.atcpu.comvoid 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:存储定长字符串相对来说实现起来简单一些,如果存储长度不确定,在删除字符串后又有新增字符串的话,需要检查被删除字符串的空间能否存储的下新增字符串。如果不能,需要找下一个存储空间。还有一种情况,所有连续的空间都不够存储用户输入的长字符串的话,可以分拆存储,但是分拆存储后查询显示时需要重新拼接。或者将数组内已存储的字符串都移位,将已删除的字符串空间给挤出来,这样连续的空间就会变长。此种情况跟磁盘碎片整体有相似之处。这部分,等写出来后再贴出来吧。
首先在数组里玩玩数组,以后换个存储介质,比如硬盘啊之类的,应该会轻松很多,只是换了几个功能函数而已。