1. 程式人生 > >C語言增刪改查

C語言增刪改查

自己用C語言寫的增刪改查,資料存入記憶體。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERROR 0;
#define TRUE 1;

char g_szBuf[1000] = { 0 };

/*選單顯示*/
void Show()
{
    system("cls");//清屏
    printf("\t字串動態管理\r\n");
    printf("1.字串增加  2.字串刪除  3.字串修改\r\n");
    printf("4.字串查詢  5.字串統計  6.顯示資料\r\n");
    printf("7.碎片整理    8.退出\r\n");
    printf("please close 1-7:");
}

/*字串增加*/
char Add()
{
    int i = 0;
    int nIndex = 0;//大陣列下標
    char ch = '\0';//輸入的y/n
    char szMark[2] = { "|" };
    char szInput[50] = { 0 };//輸入數的陣列

    while (1)
    {
        printf("請輸入要新增的:\r\n");

        scanf("%s", szInput);

        strcat(szInput, szMark);
        /*printf("%s", szInput);*/
        for (i = 0; i < strlen(szInput); i++)
        {
            g_szBuf[nIndex] = szInput[i];
            nIndex++;

            if (g_szBuf[nIndex] = '\0')
            {
                break;
            }
        }

        printf("是否繼續新增(y/n):\r\n");

        scanf("%c", &ch);//先吃一個回車
        scanf("%c", &ch);

        if (ch != 'y')
        {
            break;
        }
    }

    return 0;
}

int KMP(char *source, char *target, int *value)
{
    int i = 0;
    int j = 0;

    while (i < strlen(source))
    {  

        //不回溯,source走到尾
        if (source[i] == target[j] && j < strlen(target))
        {
            i++;
            j++;
        }
        else if (j >= strlen(target))
        {
            printf("找到...");
            system("pause");

            return TRUE;
        }
        else if (source[i] != target[j])
        {
            if (j == 0)
            {
                j = 0;
                i++;
            }
            else
            {
                j = value[j - 1];
            }
        }
    }

    if (i >= strlen(source) && j >= strlen(target))
    {
        printf("未找到...");
        system("pause");
    }
    /*else printf("未找到...");*/
    return ERROR;
}

void ShowData();
/*字串查詢*/
int Search()
{
    int i = 0;
    int j = 0;
    int nParameter = 0;
    int nIndex = 0;//新陣列的下標
    char szTemp[] = { 0 };//接受返回值
    char szInput[15] = { 0 };//輸入的陣列
    char szSearch[30] = { 0 };//存放標誌位以前數的新陣列

    ShowData();
    printf("請輸入你要查詢的:");

    scanf("%30s", szInput);
    /*scanf("%s", szInput);*/
    /*遍歷大陣列*/
    for (i = 0; i < strlen(g_szBuf); i++)
    {
        if (g_szBuf[i] == '|')
        {
            if (KMP(szSearch, szInput, nParameter))
            {
            }
            else
            {
                printf("未找到\r\n");
            }
        }
        else
        {
            /*把槓之前的數給大陣列*/
            szSearch[nIndex] = g_szBuf[i];
            nIndex++;
        }
    }
    system("pause");
}

void ShowData();
void Fifure();

/*字串刪除*/
int Del()
{
    int i = 0;
    int j = 0;
    int y = 0;
    int nIndex = 0;//下標陣列的新陣列下標
    int nCount = 0;//計數器
    int nInputOrd = 0;//輸入的序號
    char szIndex[20] = { 0 };//放下標的陣列
    char szDelete[20] = { 0 };//放新陣列的下標的少許值,做判斷的

    ShowData();

    printf("請輸入你要刪除的編號:\r\n");

    scanf("%d", &nInputOrd);

    /*遍歷大陣列*/
    for (; i < strlen(g_szBuf); i++)
    {
        if (g_szBuf[i] == '|')
        {
            szIndex[nIndex] = i;//當等於槓的時候,把槓對應的下標存到數組裡面
            nCount++;      //計數器++
            nIndex++;      //新陣列下標++

            /*如果我們輸入的數等於計數器的時候,先跳出迴圈*/
            if (nInputOrd == nCount)
            {
                break;
            }
        }
    }

    /*跳出迴圈後,根據編號來刪除相對應的資料*/
    for (j = 0; j < strlen(szIndex); j++)
    {
        /*讓輸入的編號和count值對比*/
        if (nInputOrd - 1 == j)
        {
            int k = 0;

            szDelete[k] = szIndex[j - 1];
            szDelete[++k] = szIndex[j];

            break;
        }
    }

    /*遍歷大陣列*/
    for (int n = 0; n < strlen(g_szBuf); n++)
    {
        if (n > szDelete[0] && n < szDelete[1])
        {
            g_szBuf[n] = '0';
        }
    }

    printf("刪除成功!\r\n");

    Fifure();

    system("pause");
}

void ShowData();
void Fifure();
/*字串修改*/
void Mod()
{
    int i = 0;
    int j = 0;
    int nIndex = 0;//下標陣列的新陣列下標
    int nCount = 0;//計數器
    int nInputOrd = 0;//輸入的序號
    char szIndex[20] = { 0 };//放下標的陣列
    char szDelete[20] = { 0 };//放新陣列的下標的少許值,做判斷的
    char ch = '\0';

    ShowData();

    printf("請輸入你要修改的資料:\r\n");

    scanf("%d", &nInputOrd);

    /*遍歷大陣列*/
    for (; i < strlen(g_szBuf); i++)
    {
        if (g_szBuf[i] == '|')
        {
            szIndex[nIndex] = i;//當等於槓的時候,把槓對應的下標存到數組裡面
            nCount++;      //計數器++
            nIndex++;      //新陣列下標++

            /*如果我們輸入的數等於計數器的時候,先跳出迴圈*/
            if (nInputOrd == nCount)
            {
                break;
            }
        }
    }

    /*跳出迴圈後,根據編號來刪除相對應的資料*/
    for (j = 0; j < strlen(szIndex); j++)
    {
        /*讓輸入的編號和count值對比*/
        if (nInputOrd - 1 == j)
        {
            int k = 0;

            szDelete[k] = szIndex[j - 1];
            szDelete[++k] = szIndex[j];

            break;
        }
    }

    printf("請輸入要修改的\r\n");
    /*遍歷大陣列*/
    for (int n = 0; n < strlen(g_szBuf); n++)
    {
        if (n > szDelete[0] && n < szDelete[1])
        {
            g_szBuf[n] = getch(ch);
        }
    }

    printf("修改成功!\r\n");

    system("pause");
}

/*尋找分隔符*/
int FindSpace(char ch)
{  
    int i = 0;
    char szSpace[] = { '\r', '\n', ' ', ',', '.','|' };
  
    for (i = 0; i < sizeof(szSpace); i++)
    {
        if (szSpace[i] == ch)
        {
            return 1;
        }
    }

    return 0;
}

void Fifure();
void ShowData();

/*字串統計*/
void Statis()
{
    int i = 0;
    int j = 0;
    int k = 0;
    int isSpace = 1;
    int isWord = 0;
    int nCount = 0;
    int nCount2 = 0;

    printf("去除'|'的儲存的字串總資料為:\r\n");
   
    for (; i < strlen(g_szBuf); i++)
    {

        /*因為加了豎槓,這裡需要排除豎槓輸出*/
        if (g_szBuf[i] != '|')
        {
            printf("%c", g_szBuf[i]);
        }
    }
    printf("\r\n");

    printf("沒去除'|'的儲存字串總資料為:\r\n");
    printf("%s\r\n", g_szBuf);

    for (; j < strlen(g_szBuf); j++)
    {
        if (isSpace && !FindSpace(g_szBuf[j]))
        {
            isWord = 1;
            isSpace = 0;
        }

        if (isWord && FindSpace(g_szBuf[j]))
        {
            isWord = 0;
            isSpace = 1;
            nCount++;
        }
    }

    printf("分隔符出現了%d次\r\n", nCount);
   /* printf("比例為%f\r\n", (float)(nCount/sizeof(ary)));*/

    ShowData();

    printf("\r\n");

    system("pause");
}

void Fifure();

/*顯示資料*/
void ShowData()
{
    int i = 0;
    int y = 0;
    int nFlag = 1;
    int nIndex = 1;

    printf("輸入的資料總共為:\r\n");

    for (i = 0; i < strlen(g_szBuf); i++)
    {

        /*因為加了豎槓,這裡做個判斷*/
        if (g_szBuf[i] != '|')
        {
            if (nFlag)    //標誌位,做序號
            {
                printf("%d.", nIndex);
                nFlag = 0;
            }

            printf("%c", g_szBuf[i]);
        }
        else
        {
            nIndex++;
            printf("\r\n");
            nFlag = 1;
        }
    }

    printf("\r\n");

    Fifure();

    system("pause");
}

/*分佈情況*/
void Fifure()
{
    int y = 0;

    for (y = 0; y < sizeof(g_szBuf); y++)
    {
        if (g_szBuf[y] == '|' || g_szBuf[y] == '\0' || g_szBuf[y] == '0')
        {
            printf("○");
        }
        else
        {
            printf("●");
        }
    }
}

/*碎片整理*/
void Finish()
{
    int i = 0;
    int j = 0;
    int nCount = 0;//豎槓個數
    int nDelLength = 0;//刪除的長度
    int nIndex = 0;
    char szIndex[30] = { 0 };
    int isDel = 0;//標誌是否有刪除

    for (; i < sizeof(g_szBuf); i++)
    {
        if (g_szBuf[i] == '|')
        {
            nCount++;
            isDel = 0;
        }

        if (nCount == 1 && g_szBuf[i] == '|')
        {
            nDelLength = 0;
        }

        nDelLength++;

        if (g_szBuf[i] != '0' && g_szBuf[i] != '|')
        {
            isDel = 1;
        }
        
        if (nCount == 2 && isDel == 0)
        {
            nCount = 0;
            printf("整理成功\r\n");
            
            for (j = i; j < (sizeof(g_szBuf)-(i + 1)); j++)
            {
                g_szBuf[j - (nDelLength - 2)] = g_szBuf[j + 1];
            }
        }
       

    }
    system("pause");
}

/*主函式*/
int main()
{
    int nInput = 0;

    Show();

    scanf("%d", &nInput);
    while (1)
    {
        switch (nInput)
        {
        case 1:
            Add();
            break;

        case 2:
            Del();
            break;

        case 3:
            Mod();
            break;

        case 4:
            Search();
            break;

        case 5:
            Statis();
            break;

        case 6:
            ShowData();
            break;

        case 7:
            Finish();
            break;

        case 8:
            break;

        default:
            break;
        }

        system("cls");

        Show();

        scanf("%d", &nInput);
    }

    return 0;
}

有什麼問題歡迎交流和提問!~~~~