C語言增刪改查
阿新 • • 發佈:2019-02-08
自己用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; }