C語言中的字元指標和函式



什麼是C語言中的字元指標?

字元指標儲存字元型別或字元陣列(字串)第一個字元的地址。當您處理字串時,字元指標非常有用。

C語言中沒有字串資料型別。“char”型別的陣列被視為字串。因此,char型別陣列的指標代表一個字串。然後可以將此char指標作為引數傳遞給函式來處理字串。

宣告字元指標

字元指標指向字元或字元陣列。因此,要宣告字元指標,請使用以下語法:

char *pointer_name;

初始化字元指標

宣告字元指標後,需要用字元變數的地址對其進行初始化。如果有字元陣列,只需提供字元陣列的名稱或其第一個元素的地址即可初始化字元指標。

字元的字元指標

以下是初始化字元型別字元指標的語法:

char *pointer_name = &char_variable;

字元陣列的字元指標

以下是初始化字元陣列(字串)字元指標的語法:

char *pointer_name = char_array;
/*or*/
char *pointer_name = &char_array[0];

字元指標示例

在下面的示例中,我們有兩個變數字元和字元陣列。我們正在獲取兩個指標變數來儲存字元和字元陣列的地址,然後使用字元指標列印變數的值。

#include <stdio.h>

int main() {
  // Declare two variables
  char x = 'P';
  char arr[] = "TutorialsPoint";

  // Declaring character pointers
  char *ptr_x = &x;
  char *ptr_arr = arr;

  // Printing values
  printf("Value of x : %c\n", *ptr_x);
  printf("Value of arr: %s\n", ptr_arr);
  
  return 0;
}

輸出

執行程式碼並檢查其輸出:

Value of x : P
Value of arr: TutorialsPoint

理解字元指標

字串宣告為如下陣列:

char arr[] = "Hello";

字串是空終止的字元陣列。上述陣列中的最後一個元素是空字元(\0)。

宣告char型別的指標併為其賦值第0個位置的字元地址:

char *ptr = &arr[0];

請記住,陣列的名稱本身就是第0個元素的地址。

char *ptr = arr;

可以使用指標而不是陣列變數(無方括號)來宣告字串。

char *ptr = "Hello";

這會導致字串儲存在記憶體中,其地址儲存在ptr中。我們可以透過遞增ptr來遍歷字串。

while(*ptr != '\0'){
   printf("%c", *ptr);
   ptr++;
}

訪問字元陣列

如果使用%s格式說明符列印字元陣列,可以使用字元指標的名稱來實現。但是,如果要訪問字元陣列的每個字元,則必須在字元指標名稱之前使用星號(*),然後遞增它。

示例

這是完整的程式程式碼:

#include <stdio.h>

int main(){

   char arr[] = "Character Pointers and Functions in C";
   char *ptr = arr;

   while(*ptr != '\0'){
      printf("%c", *ptr);
      ptr++;
   }
}

輸出

執行程式碼並檢查其輸出:

Character Pointers and Functions in C

示例

或者,將ptr以%s格式傳遞給printf()來列印字串。

#include <stdio.h>

int main(){

   char arr[] = "Character Pointers and Functions in C";
   char *ptr = arr;

   printf("%s", ptr);
}

輸出

執行此程式碼後,您將獲得相同的輸出:

Character Pointers and Functions in C

字元指標函式

"string.h"標頭檔案定義了許多執行字串處理的庫函式,例如查詢字串的長度、複製字串和比較兩個字串。這些函式使用char指標引數。

strlen()函式

strlen()函式返回字串的長度,即字串中的字元數。strlen()函式的原型如下:

int strlen(char *)

示例1

以下程式碼顯示如何列印字串的長度:

#include <stdio.h>
#include <string.h>

int main(){

   char *ptr = "Hello";

   printf("Given string: %s \n", ptr);
   printf("Length of the string: %d", strlen(ptr));

   return 0;
}

執行此程式碼時,它將產生以下輸出:

Given string: Hello 
Length of the string: 5

示例2

實際上,strlen()函式根據如下所示的使用者定義函式str_len()計算字串長度:

#include <stdio.h>
#include <string.h>

int str_len(char *);

int main(){

   char *ptr = "Welcome to Tutorialspoint";
   int length = str_len(ptr);
   printf("Given string: %s \n", ptr);
   printf("Length of the string: %d", length);
   
   return 0;
}

int str_len(char *ptr){
   int i = 0;
   while(*ptr != '\0'){
      i++;
      ptr++;
   }
   return i;
}

執行此程式碼時,它將產生以下輸出:

Given string: Welcome to Tutorialspoint 
Length of the string: 25

strcpy()函式

賦值運算子(=)不用於將字串值賦值給字串變數,即char指標。相反,我們需要使用strcpy()函式,其原型如下:

char * strcpy(char * dest, char * source);

示例1

以下示例顯示如何使用strcpy()函式:

#include <stdio.h>
#include <string.h>

int main(){

   char *ptr = "How are you doing?";
   char *ptr1;

   strcpy(ptr1, ptr);
   printf("%s", ptr1);

   return 0;
}

strcpy()函式返回指向目標字串ptr1的指標。

How are you doing?

示例2

在內部,strcpy()函式在使用者定義的str_cpy()函式中實現以下邏輯:

#include <stdio.h>
#include <string.h>

void str_cpy(char *d, char *s);

int main(){

   char *ptr = "Using the strcpy() Function";
   char *ptr1;

   str_cpy(ptr1, ptr);
   printf("%s", ptr1);
   return 0;
}

void str_cpy(char *d, char *s){
   int i;
   for(i = 0; s[i] != '\0'; i++)
      d[i] = s[i];

   d[i] = '\0';
}

執行此程式碼時,它將產生以下輸出:

Using the strcpy() Function

該函式將每個字元從源字串複製到目標字串,直到遇到空字元"\0"。迴圈結束後,它會在目標陣列末尾新增一個"\0"字元。

strcmp()函式

通常的比較運算子(<,>,<=,>=,==和!=)不允許用於比較兩個字串。相反,我們需要使用"string.h"標頭檔案中的strcmp()函式。此函式的原型如下:

int strcmp(char *str1, char *str2)

strcmp()函式三個可能的返回值

  • 當發現兩個字串相同時,它返回“0”。
  • 當str1中第一個不匹配的字元的ASCII值大於str2中對應字元的ASCII值時,函式返回正整數。這意味著str1按字母順序出現在str2之後,就像在字典中一樣。
  • 當str1中第一個不匹配的字元的ASCII值小於str2中對應字元的ASCII值時,函式返回負整數。這意味著str1按字母順序出現在str2之前,就像在字典中一樣。

示例1

以下示例演示如何在C程式中使用strcmp()函式:

#include <stdio.h>
#include <string.h>

int main(){

   char *s1 = "BASK";
   char *s2 = "BALL";

   int ret = strcmp(s1, s2);

   if (ret == 0)
      printf("Both strings are identical\n");
   else if (ret > 0)
      printf("The first string appears after the second string \n");
   else
      printf("The first string appears before the second string \n");

   return 0;
}

執行程式碼並檢查其輸出:

The first string appears after the second string

s1更改為BACK並再次執行程式碼。現在,您將獲得以下輸出

The first string appears before the second string

示例2

您可以使用使用者定義的函式str_cmp()獲得類似的結果,如下面的程式碼所示:

#include <stdio.h>
#include <string.h>

int str_cmp(char *str1, char *str2);

int main(){

   char *s1 = "The Best C Programming Tutorial Available Online";
   char *s2 = "The Best C Programming Tutorial Available Online";

   int ret = str_cmp(s1, s2);

   if (ret == 0)
      printf("Both strings are identical\n");
   else if (ret > 0)
      printf("The first string appears after the second string\n");
   else
      printf("The first string appears before the second string\n");

   return 0;
}

int str_cmp(char *str1, char *str2) {
   while (*str1 != '\0' && *str2 != '\0') {
      if (*str1 != *str2) {
         return *str1 - *str2;
      }
      str1++;
      str2++;
   }

   // If both strings are equal, return 0
   
   return 0;
}

執行此程式碼時,它將產生以下輸出:

Both strings are identical

str_cmp() 函式比較兩個字串中相同索引處的字元,直到其中一個字串的字元耗盡或找到相等的字元。

當檢測到相同索引處字元不相等時,返回其ASCII值之差。如果迴圈終止,則返回“0”。

廣告