|
Posted on 2008-08-19 17:12 ∪∩BUG 閱讀(2019) 評(píng)論(0) 編輯 收藏 所屬分類: VC++/MFC學(xué)習(xí)筆記
使用說(shuō)明
程序名為 NO3.exe.運(yùn)行環(huán)境為DOS,執(zhí)行后顯示:
在"請(qǐng)輸入你的選擇后(1.2.3.4.5.6)"后輸入數(shù)字選擇執(zhí)行的功能.
測(cè)試結(jié)果:
-
選擇1.后輸入:123456789
-
選擇2后輸入分別輸入1,3.
重復(fù)1)操作后選擇2,分別輸入10,10.
-
-
重復(fù)1)操作后選擇3.分別輸入1,abcde
再重復(fù)1)操作后選擇3.分別輸入9,abcde

-
-
再重復(fù)1)操作后選擇4,分別輸入1,3
再重復(fù)1)操作后選擇4,分別輸入0,3
再重復(fù)1)操作后選擇4,分別輸入10,3
5) 再重復(fù)1)操作后選擇5,分別輸入1,abcde
再重復(fù)1)操作后選擇5,分別輸入9,abcde
再重復(fù)1)操作后選擇5,分別輸入0,abcde
再重復(fù)1)操作后選擇5,分別輸入10,abcde
6)運(yùn)行No3.exe后選擇6或輸入非"1,2,3,4,5"的數(shù)字
調(diào)試過(guò)程:
-
本調(diào)試主要針對(duì)置換操作功能進(jìn)行演示:
-
將光標(biāo)移置String:: Replace(String t1,int pos)函數(shù)的第一條語(yǔ)句處Ctrl+F10開(kāi)始調(diào)試
-
在DOS窗口中選擇1后輸入"123456789".接著選擇5分別輸入1,abcde.
這時(shí)Debugger停留在String:: Replace(String t1,int pos)的第一條語(yǔ)句處:

-
在Watch窗口的名稱欄分別輸入: str, t1.str, q, out, pos, (-pos) +1, pos – size,j,i.進(jìn)行觀察.
-
按F10開(kāi)始單步調(diào)試.
-
按F10三次后Debugger停留在最后一個(gè)判斷語(yǔ)句處.同時(shí)Watch窗口中個(gè)名稱的值分別為:
-
接著單步調(diào)試,for()函數(shù)完后,Debugger停留在" delete t1.str;"語(yǔ)句處.
這時(shí)Watch窗口中個(gè)各名稱的值分別為:
接著兩次F10,這時(shí)t1.str和out的值已經(jīng)改變,Debugger停留在String:: Replace(String t1,int pos)的結(jié)束處.
-
再按一次F10,Debugger停留在main()函數(shù)的switch(k)里的case 5的if()語(yǔ)句處:

F10到調(diào)用Display()函數(shù)的語(yǔ)句處后F11跟進(jìn)Display()的內(nèi)部.
在Watch窗口的名稱中輸入str,I,len進(jìn)行觀察.
單步調(diào)試到Display()函數(shù)結(jié)束,Debugger停留在Display()函結(jié)束處.
在Watch窗口中str,I,len的值分別為:
同時(shí)DOS窗口中顯示如下:
-
按Shift+F5退出調(diào)試.完成調(diào)試操作.
參考源碼:
-
1 Code:
2 //3.h
3 #include <iostream.h>
4 #include <string.h>
5 #include <stdlib.h>
6 //using namespace std;
7 int out; // 定義一個(gè)全局變量
8 class String
9  {
10 public:
11 String() {}
12 ~String() {}
13 String SubString(int pos,int num); //取子串函數(shù)
14 void Insert(String t,int pos); //插入子串函數(shù)
15 void Delete(int pos,int num); //刪除子串函數(shù)
16 void Creat(); //生成字符串函數(shù)
17 void Display(); //打印子串函數(shù)
18 Replace(String t1,int pos); //置換子串函數(shù)
19 private:
20 char *str;
21 int size;
22 };
23
24 //3.cpp
25 #include "3.h"
26 //生成新字符串函數(shù)
27 void String:: Creat()
28 {
29 char s[100];
30 cin>>s;
31 size=strlen(s);
32 str=new char[size + 1];
33 if(str==0)
34 cout<<"沒(méi)有申請(qǐng)到空間!"<<endl;
35 strcpy( str, s);
36 //strcpy_s(str,sizeof(str)/sizeof(str[0]),s);
37
38 }
39 //輸出
40 void String::Display()
41  {
42 int len = size;
43 int i;
44 for( i=0;i < size;i++ )
45 cout<<str[i];
46 cout<<endl;
47 cout<<"字符串的總長(zhǎng)度為:"<<len<<endl;
48 }
49 //求子串
50 //void String String::SubString(int pos,int num)
51 String String::SubString(int pos,int num)
52  {
53 String temp;
54 int left=size-pos + 1;//從pos位置開(kāi)始所有余下的字符串長(zhǎng)度
55 char *p,*q;
56 if( pos > size )
57 {
58 cout<<"錯(cuò)誤!"<<endl;
59 cout<<"指定位置超過(guò)字符串長(zhǎng)度為:"<< pos - size<<endl;//提示所取子串的錯(cuò)誤位置
60 exit (1);//異常退出
61 }
62 else if( num > left )
63 num = left;
64 temp.str=new char[num+1];//重新分配內(nèi)存空間
65 if(temp.str==0)
66 cout<<"沒(méi)有申請(qǐng)到空間!"<<endl;
67 p=temp.str;
68 for(int i = pos-1;i < pos+num-1;i++)
69 {
70 q = &str[i];
71 *p = *q;
72 p++;
73 }
74 *p=0;
75 temp.size = num;
76 return temp;
77 }
78
79 //插入運(yùn)算:在串對(duì)象s的pos位置后插入一個(gè)串t
80 void String::Insert(String t,int pos)
81  {
82 //String temp;
83 int i_len = t.size;
84 cout<<"插入字符串的長(zhǎng)度為:"<<i_len<<endl;
85
86 char *q;
87 q = new char( size + 1);
88 strcpy(q,str);
89
90 delete str;
91 str = new char( size + t.size + 1); //字符串長(zhǎng)度要在原長(zhǎng)上增加插入串的長(zhǎng)度
92
93
94 strcpy(str,q);
95
96 //依次后移,空出長(zhǎng)度為插入字符串的長(zhǎng)度的空間
97
98 for(int j = size-1;j > pos-1;j--)
99 {
100 int i = j + t.size;
101 str[ i-- ] = str[ j ];
102 }
103
104 j = pos;
105 for(int i = 0;i < t.size;)
106 {
107 str[j++] = t.str[i++];
108 }
109
110 size+=t.size;
111 str[size + 1]='\0';
112
113 }
114
115
116 //刪除 :刪除串中的一個(gè)子串
117 void String:: Delete(int pos,int num)
118  {
119 //用if else if語(yǔ)句判斷刪除的位置是否越界
120 if(pos <= 0)
121 {
122 cout<<"無(wú)法完成刪除操作!"<<endl<<"刪除位置低于字符串長(zhǎng)度為:"<< (-pos) +1<<endl;
123 exit (1);
124 }
125 else if( pos > size )
126 {
127 cout<<"無(wú)法完成刪除操作!"<<endl<<"刪除位置超過(guò)字符串長(zhǎng)度為:"<< pos - size <<endl;
128 exit (1);
129 }
130 else if(pos >= 0 && pos <= size )
131 {
132 int i = pos - 1;
133 for(int j = (pos + num -1); j <= size ; j++) //從刪除到的位置開(kāi)始前移
134 {
135 str[i] = str[j];
136 i++;
137 }
138 }
139 size = size-num; //只取刪除后余下的字符個(gè)數(shù)
140 }
141
142 //置換:置換串中的一個(gè)子串
143 String:: Replace(String t1,int pos)
144  {
145 //用if else if語(yǔ)句判斷置換的位置是否越界
146 if(pos <= 0)
147 {
148 cout<<"無(wú)法完成轉(zhuǎn)換操作!"<<endl<<"置換位置低于字符串長(zhǎng)度為:"<<(-pos) +1 <<endl;
149 exit (1);
150 }
151 else if(pos > size)
152 {
153 cout<<"無(wú)法完成置換操作!"<<endl<<"置換位置超過(guò)字符串長(zhǎng)度為:"<< pos - size <<endl;
154 exit (1);
155 }
156
157 //當(dāng)置換的位置加上置換給的子串長(zhǎng)度之和超過(guò)原字符串的長(zhǎng)度時(shí)
158 //在將不被置換的字符串長(zhǎng)度的拷后追加新字符串的長(zhǎng)度
159 else if( (t1.size+pos) >size )
160 {
161
162 char *q; //定義指針數(shù)組q用來(lái)轉(zhuǎn)存原先將不被置換的字符串
163 q = new char[ pos +1] ; //給q分配足夠的空間為將不被置換的字符串的長(zhǎng)度
164 for( int i = 0;i < pos-1;i++ )
165 {
166 q[i] = str[i];
167
168 }
169
170 q[pos-1] = '\0';
171 delete []str; //釋放原字符串空間
172 strcat(q,t1.str); //通過(guò)strcat函數(shù)將輸入的子串與原子串的拷貝
173 cout<<"置換后的字符串為: "<<q<<endl;
174 return out = 0;
175 }
176
177 else if( (t1.size+pos) <= size )
178 {
179 int j = pos - 1;
180 for(int i = 0;i < t1.size;i++)
181 str[j++] = t1.str[i];
182 delete t1.str;
183 return out = 1;
184 }
185
186
187 }
188 //主函數(shù)
189 int main(int argc, char* argv[])
190  {
191 int pos,num,k;
192 String s,s1,s2,t,t1;
193 do {
194 cout<<"\n\n 1.生成字符串" ;
195 cout<<"\n\n 2.取子串";
196 cout<<"\n\n 3.插入子串s1";
197 cout<<"\n\n 4.刪除子串";
198 cout<<"\n\n 5.置換子串";
199 cout<<"\n\n 6.結(jié)束程序";
200 cout<<"\n******************************** ";
201 cout<<"\n 請(qǐng)輸入你的選擇(1,2,3,4,5,6)";
202 cin>>k;
203 switch(k) {
204 case 1: {
205 cout<<"請(qǐng)輸入一個(gè)字符串:";
206 s.Creat();
207 cout<<"字符串為: ";
208 s.Display();
209 }break;
210 case 2: {
211 cout<<"請(qǐng)輸入子串的截取位置pos及子串長(zhǎng)度num"<<endl;
212 cin>>pos>>num;
213 t = s.SubString(pos,num);
214 cout<<"你所取的子串為: ";
215 t.Display();
216 }break;
217 case 3: {
218 cout<<"請(qǐng)輸入子串插入位置pos"<<endl;
219 cin>>pos;
220 cout<<"請(qǐng)輸入要插入的子串: ";
221 s1.Creat();
222 s.Insert(s1,pos);
223 cout<<"插入后的字符串為: ";
224 s.Display();
225 }break;
226 case 4: {
227 cout<<"請(qǐng)輸入要?jiǎng)h除子串的開(kāi)始位置pos及子串長(zhǎng)度num"<<endl;
228 cin>>pos>>num;
229 s.Delete(pos,num);
230 cout<<"刪除后的字符串為: ";
231 s.Display();
232 }break;
233 case 5: {
234 cout<<"請(qǐng)輸入子串置換位置pos"<<endl;
235 cin>>pos;
236 cout<<"請(qǐng)輸入要置換的子串: ";
237 s2.Creat();
238 s.Replace(s2,pos);
239 if( out != 0 )
240 {
241 cout<<"置換后的字符串為: ";
242 s.Display();
243 }
244 }break;
245 default:break;
246 } //switch
247 cout<<"\n--------------------------------- ";
248 }while(k>=1&&k<6);
249 cout<<"\n 再見(jiàn)!";
250 cout<<"\n 按任意鍵,返回。";
251 return 0;
252 }
253
|