取得字串長度

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;
}
請輸入字串:abcde
字串長度:5

指標法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;
}
請輸入字串:abcdef
abcdef

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;
}

results matching ""

    No results matching ""