取得字串長度
Prerequisites:
實作strlen()函式
取得字串長度
陣列法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| int length(char* str) {
//初始值
int len = 0;
//條件判斷式為字元不等於\0,進入迴圈
for (;str[len] != 0; len++);
return len;
}
int main() {
char str[100];
//清空記憶體的值
memset(str,0,sizeof(str));
cout << "請輸入字串:"; cin >> str;
cout << "字串長度:" << length(str) << endl;
return 0;
}
|
指標法1
1
2
3
4
5
6
7
8
9
10
11
12
13
| int length(char* str) {
int len = 0;
//指標移到字串陣列[0]的位址
char *ptr = str;
//判斷字元
while(*ptr != 0) {
//位址往下一個陣列索引移動
ptr++;
//記錄字串長度
len++;
}
return len;
}
|
精簡版
1
2
3
4
5
6
| int length(char* str) {
int len = 0;
char *ptr = str;
while(*ptr++) len++;
return len;
}
|
指標法2
1
2
3
4
5
| int length(char* str) {
int len = 0;
for (char *pos = str; *pos; pos++, len++);
return len;
}
|
遞迴法
1
2
3
4
5
6
7
8
9
| int length(char* str) {
//離開遞迴基本條件base case
if (*str == 0) return 0;
//若字元不為空字元,就執行以下程式碼
//指標往下個位址移動
str++;
//類似迴圈len++
return length(str) + 1;
}
|
印出字串
100次迴圈
1
2
3
4
5
6
7
8
9
10
| int main() {
char str[100];
//清空記憶體的值
memset(str,0,sizeof(str));
cout << "請輸入字串:"; cin >> str;
for (char *pos = str; *pos; pos++)
cout << *pos;
cout << endl;
return 0;
}
|
1000次迴圈
for執行100次
strlen()執行100次
100*100 = 1000次迴圈
1
2
3
4
5
6
7
8
9
10
11
12
| int main() {
char str[100];
//清空記憶體的值
memset(str,0,sizeof(str));
cout << "請輸入字串:"; cin >> str;
for (int i = 0; i < strlen(str); i++) {
cout << str[i];
}
cout << endl;
return 0;
}
|
200次迴圈
將以上程式碼改善,把strlen移到初始運算式或定義在for迴圈之前,初始運算式只執行一次。
1
2
3
4
5
6
7
8
9
10
11
12
| int main() {
char str[100];
//清空記憶體的值
memset(str,0,sizeof(str));
cout << "請輸入字串:"; cin >> str;
for (int i = 0, len = strlen(str); i < len; i++) {
cout << str[i];
}
cout << endl;
return 0;
}
|