Cprogramming 简明教程

Character Pointers and Functions in C

What is a Character Pointer in C?

character pointer 存储字符类型或字符数组第一个字符的地址 ( string )。当您需要操作字符串时,字符指针非常有用。

C 中没有 string 数据类型。“char”类型的数组被视为一个字符串。因此,char 类型数组的指针表示一个字符串。然后,将此 char 指针作为一个 function 的参数传递,以处理字符串。

Declaring a Character Pointer

字符指针指向一个字符或一个字符数组。因此,要声明字符指针,请使用以下语法:

char *pointer_name;

Initializing a Character Pointer

在声明字符指针之后,您需要使用字符变量的地址对其进行初始化。如果存在字符数组,您可以简单地通过提供字符数组的名称或其第一个元素的地址来初始化字符指针。

Character Pointer of Character

以下是初始化字符类型字符指针的语法:

char *pointer_name = &char_variable;

Character Pointer of Character Array

以下是初始化字符数组(字符串)字符指针的语法:

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

Character Pointer Example

在以下示例中,我们有两个 variables 字符和字符数组。我们正在使用两个 pointer 变量来存储字符和字符数组的地址,然后使用字符指针打印变量的值。

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

Output

运行代码并检查其输出:

Value of x : P
Value of arr: TutorialsPoint

Understanding Character Pointer

字符串以下列方式声明为数组:

char arr[] = "Hello";

字符串是字符的 NULL 终止数组。以上数组中的最后一个元素是 NULL 字符(\0)。

声明 char 类型的指针,并将它的地址指定为第 0 个位置的字符:

char *ptr = &arr[0];

记住,数组本身的名称是第 0 个元素的地址。

char *ptr = arr;

可以使用指针而不是数组变量(没有方括号)来声明字符串。

char *ptr = "Hello";

这会导致将字符串存储在内存中,并将其地址存储在 ptr 中。我们可以通过增加 ptr 来遍历字符串。

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

Accessing Character Array

如果使用 %s 格式说明符打印字符数组,您可以使用字符指针的名称。但是,如果您想访问字符数组的每个字符,您必须在字符指针名称前面使用星号 (*) 然后增加它。

Example

下面是完整的程序代码:

#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

Example

或者,使用 %s 格式将 ptr 传递给 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

Character Pointer Functions

"string.h" header 文件定义了许多库函数用于执行字符串处理,例如查找字符串的长度、复制字符串和比较两个字符串。这些函数使用 char 指针参数。

The strlen() Function

strlen() function 返回长度,即字符串中的字符数。strlen() 函数的原型如下:

int strlen(char *)

以下代码显示了如何打印字符串的长度:

#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

实际上, 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

The strcpy() Function

赋值运算符 ( = ) 不用于将字符串值指定给字符串变量,即 char 指针。相反,我们需要使用具有以下原型的 strcpy() function

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

以下示例说明了如何使用 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?

在内部,strcpy() 函数在 user-defined str_cpy() function 中实现以下逻辑:

#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

该函数将源字符串中的每个字符复制到目标字符串,直到达到 NULL 字符“\0”。在循环之后,它会在目标数组的末尾添加一个“\0”字符。

The strcmp() Function

通常的比较运算符(<、>、⇐、>=、== 和 !=)不能用于比较两个字符串。相反,我们需要使用“string.h”头文件中的 strcmp() 函数。此功能的原型如下 −

int strcmp(char *str1, char *str2)

strcmp() functionthree possible return values

  1. 当发现两个字符串都 identical ,它会返回“0”。

  2. 当 str1 中第一个不匹配的字符有比在 str2 中相应字符更大的 ASCII 值时,该函数 returns a positive integer 。它意味着按照字典顺序,str1 出现于 str2 之后。

  3. 当 str1 中第一个不匹配的字符有比在 str2 中相应字符更小的 ASCII 值时,该函数 returns a negative integer 。它意味着按照字典顺序,str1 出现于 str2 之前。

以下示例演示如何在 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 重新运行代码。然后,将获得以下 output

The first string appears before the second string

您可以使用用户自定义函数 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”。