C语言增删改查

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36818386/article/details/81428030

自己用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;
}

有什么问题欢迎交流和提问!~~~~

猜你喜欢

转载自blog.csdn.net/qq_36818386/article/details/81428030