自己用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;
}
有什么问题欢迎交流和提问!~~~~