在数组中编辑定长字符串
以下代码实现了在数组中存储、查询、删除字符串功能,存储的每个字符串最长长度为9(不包含字符串结束符\0)。
新增用户输入字符串时,依次扫描以10字节为基数的数组空间,如果标志位为1,说明是有效字符,直到找到标志位为0的空间,然后存储。
删除一个字符串之后,此字符串存放空间释放(标志置为0),可以存入用户输入的新字符串。
查询字符串时,标志为1则显示,标志位为0则为已删除的无效字符串,不显示。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 // 存储字符串的数组总长度 6 #define CSTRSPACE (10000) 7 8 // 存储标志位的数组总长度 9 #define NFLAGLEN ((CSTRSPACE) / (10)) 10 11 void addString(char *pcStr, int *pnFlag); 12 13 void delString(char *pcStr, int *pnFlag); 14 15 void printAllString(char *pcStr, int *pnFlag); 16 17 void searchString(char *pcStr, int *pnFlag); 18 19 int main() 20 { 21 char cStr[CSTRSPACE] = {0}; 22 int nFlag[NFLAGLEN] = {0}; 23 char *pcStr = cStr; 24 int *pnFlag = nFlag; 25 int nUserChoose = 0; 26 int nSearchFlag = 0; 27 28 while(1) 29 { 30 printf("1. Add string\t\t2. Delete string\r\n" 31 "3. Print All string\t4. Search string\r\n" 32 "0. Exit\r\n"); 33 printf("please input a number:\r\n\r\n"); 34 35 nUserChoose = 0; 36 scanf("%d", &nUserChoose); 37 38 if (0 == nUserChoose) 39 { 40 break; 41 } 42 43 switch(nUserChoose) 44 { 45 case 1: 46 { 47 addString(pcStr, pnFlag); 48 } 49 break; 50 51 case 2: 52 { 53 delString(pcStr, pnFlag); 54 } 55 break; 56 57 case 3: 58 { 59 printAllString(pcStr, pnFlag); 60 } 61 break; 62 63 case 4: 64 { 65 searchString(pcStr, pnFlag); 66 } 67 break; 68 69 default: 70 { 71 printf("Wrong choose!\r\n"); 72 } 73 break; 74 } 75 } 76 77 system("pause"); 78 return 0; 79 } 80 81 // 添加字符串 82 void addString(char *pcStr, int *pnFlag) 83 { 84 int i = 0; 85 86 printf("please input a string:\r\n"); 87 for (i = 0; i < NFLAGLEN; i++) 88 { 89 if (*(pnFlag + i) == 0) 90 { 91 scanf("%9s", (pcStr + i * 10)); 92 fflush(stdin); 93 printf("add succeed!\r\n\r\n"); 94 *(pnFlag + i) = 1; 95 break; 96 } 97 } 98 if (NFLAGLEN == i) 99 { 100 printf("No Space!\r\n"); 101 } 102 } 103 104 // 删除字符串 105 void delString(char *pcStr, int *pnFlag) 106 { 107 int i = 0; 108 109 printAllString(pcStr, pnFlag); 110 111 printf("please input a number:\r\n"); 112 scanf("%d", &i); 113 114 // 数据未清空,只是将标志位置为0 115 if (*(pnFlag + i) != 0) 116 { 117 *(pnFlag + i) = 0; 118 printf("delete succeed!\r\n\r\n"); 119 } 120 else 121 { 122 printf("Wrong!\r\n\r\n"); 123 } 124 } 125 126 // 输出所有字符串 127 void printAllString(char *pcStr, int *pnFlag) 128 { 129 int i = 0; 130 131 printf("\r\n"); 132 for (i = 0; i < NFLAGLEN; i++) 133 { 134 //标志位为1则显示 135 if (*(pnFlag + i) == 1) 136 { 137 printf("%d:\t%s\r\n", i, (pcStr + i * 10)); 138 } 139 } 140 printf("\r\n"); 141 } 142 143 // 查询某个字符串是否存在 144 void searchString(char *pcStr, int *pnFlag) 145 { 146 char szSearch[10] = {0}; 147 int i = 0; 148 int nSearchFlag = 0; 149 int nPrintFlag = 1; 150 151 printf("please input a string:\r\n"); 152 scanf("%9s", szSearch); 153 154 for (i = 0; i < NFLAGLEN; i++) 155 { 156 if (*(pnFlag + i) != 0) 157 { 158 nSearchFlag = strcmp((pcStr + i * 10), szSearch); 159 if (nSearchFlag != 0) 160 { 161 continue; 162 } 163 else 164 { 165 printf("%d\t%s\r\n", i, (pcStr + i * 10)); 166 nPrintFlag = 0; 167 } 168 } 169 } 170 if (nPrintFlag != 0) 171 { 172 printf("can't found it!\r\n"); 173 } 174 printf("\r\n"); 175 }
PS:存储定长字符串相对来说实现起来简单一些,如果存储长度不确定,在删除字符串后又有新增字符串的话,需要检查被删除字符串的空间能否存储的下新增字符串。如果不能,需要找下一个存储空间。还有一种情况,所有连续的空间都不够存储用户输入的长字符串的话,可以分拆存储,但是分拆存储后查询显示时需要重新拼接。或者将数组内已存储的字符串都移位,将已删除的字符串空间给挤出来,这样连续的空间就会变长。此种情况跟磁盘碎片整体有相似之处。这部分,等写出来后再贴出来吧。
首先在数组里玩玩数组,以后换个存储介质,比如硬盘啊之类的,应该会轻松很多,只是换了几个功能函数而已。
posted on 2012-05-13 15:08 Elijah Wong 阅读(1264) 评论(0) 收藏 举报
浙公网安备 33010602011771号