灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2695回复:0

在数组中编辑定长字符串

楼主#
更多 发布于:2012-09-06 12:31


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



喜欢0 评分0
游客

返回顶部