程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 在數組中編輯定長字符串

在數組中編輯定長字符串

編輯:關於C語言

以下代碼實現了在數組中存儲、查詢、刪除字符串功能,存儲的每個字符串最長長度為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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved