在数组中编辑定长字符串

以下代码实现了在数组中存储、查询、删除字符串功能,存储的每个字符串最长长度为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)    收藏  举报