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”。

广告