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;
}

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

  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这是一个比较大的项目,需要进行详细的设计和实现。下面是一个简单的登陆系统增删改插的示例,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_USERS 100 // 最多支持的用户数 #define MAX_NAME_LEN 20 // 用户名最大长度 // 用户结构体 typedef struct { char name[MAX_NAME_LEN]; // 用户名 char pwd[MAX_NAME_LEN]; // 密码 } User; int user_count = 0; // 用户数量 User users[MAX_USERS]; // 用户数组 // 查找用户,返回用户在数组的下标 int find_user(const char *name) { int i; for (i = 0; i < user_count; i++) { if (strcmp(users[i].name, name) == 0) { return i; } } return -1; } // 添加用户 void add_user() { if (user_count >= MAX_USERS) { printf("用户数量已达到上限!\n"); return; } User user; printf("请输入用户名:"); scanf("%s", user.name); if (find_user(user.name) != -1) { printf("用户名已存在!\n"); return; } printf("请输入密码:"); scanf("%s", user.pwd); users[user_count] = user; user_count++; printf("添加成功!\n"); } // 删除用户 void del_user() { char name[MAX_NAME_LEN]; printf("请输入要删除的用户名:"); scanf("%s", name); int idx = find_user(name); if (idx == -1) { printf("用户不存在!\n"); return; } // 从数组删除用户 for (int i = idx; i < user_count - 1; i++) { users[i] = users[i + 1]; } user_count--; printf("删除成功!\n"); } // 修改密码 void modify_pwd() { char name[MAX_NAME_LEN]; printf("请输入要修改密码的用户名:"); scanf("%s", name); int idx = find_user(name); if (idx == -1) { printf("用户不存在!\n"); return; } printf("请输入新密码:"); scanf("%s", users[idx].pwd); printf("密码修改成功!\n"); } // 显示所有用户信息 void show_users() { printf("用户名\t密码\n"); for (int i = 0; i < user_count; i++) { printf("%s\t%s\n", users[i].name, users[i].pwd); } } int main() { while (1) { printf("\n1. 添加用户\n"); printf("2. 删除用户\n"); printf("3. 修改密码\n"); printf("4. 显示所有用户\n"); printf("5. 退出\n"); printf("请选择操作:"); int choice; scanf("%d", &choice); switch (choice) { case 1: add_user(); break; case 2: del_user(); break; case 3: modify_pwd(); break; case 4: show_users(); break; case 5: return 0; default: printf("无效的选择!\n"); } } return 0; } ``` 以上代码实现了一个简单的登陆系统,包括添加用户、删除用户、修改密码和显示所有用户信息等功能。可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丸子哥哥

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值