C 语言编程教程

C 语言首页

C 语言基础

C 语言概述 C 语言特性 C 语言发展历史 C 语言下载安装和环境配置 C 语言程序结构 C 语言 Hello World C 编译过程 C 注释 C 标记 C 关键字 C 标识符 C 用户输入 C 基本语法 C 数据类型 C 变量 C 整数提升 C 类型转换 C 类型转换 C 布尔值

C 语言中的常量和文字

C 常量 C 字面量 C 转义序列 C 格式说明符

C 语言中的运算符

C 运算符 C 算术运算符 C 关系运算符 C 逻辑运算符 C 位运算符 C 赋值运算符 C 一元运算符 C 递增和递减运算符 C 三元运算符 C sizeof 运算符 C 运算符优先级 C 其他运算符

C 语言中的决策

C 决策 C if 语句 C if...else 语句 C 嵌套 if 语句 C switch 语句 C 嵌套 switch 语句

C 语言中的循环

C 循环 C While 循环 C For 循环 C Do...while 循环 C 嵌套循环 C 无限循环 C Break 语句 C Continue 语句 C goto 语句

C 语言中的函数

C 函数 C Main 函数 C 按值调用函数 C 按引用调用函数 C 嵌套函数 C 可变参数函数 C 用户定义函数 C 回调函数 C return 语句 C 递归

C 语言中的作用域规则

C 作用域规则 C 静态变量 C 全局变量

C 语言中的数组

C 数组 C 数组的属性 C 多维数组 C 将数组传递给函数 C 从函数返回数组 C 可变长度数组

C 语言中的指针

C 指针 C 指针和数组 C 指针的应用 C 指针运算 C 指针数组 C 指向指针的指针 C 将指针传递给函数 C 从函数返回指针 C 函数指针 C 指向数组的指针 C 指向结构体的指针 C 指针链 C 指针 vs 数组 C 字符指针和函数 C NULL 指针 C void 指针 C 悬垂指针 C 解引用指针 C Near、Far 和 Huge 指针 C 指针数组的初始化 C 指针与多维数组

C 语言中的字符串

C 字符串 C 字符串数组 C 特殊字符

C 语言的结构体和联合

C 结构体 C 结构体和函数 C 结构体数组 C 自引用结构 C 查找表 C 点 (.) 运算符 C 枚举(或 enum) C 结构填充和打包 C 嵌套结构 C 匿名结构和联合 C 联合 C Bit 位字段 C Typedef

C 语言中的文件处理

C 输入和输出 C 文件 I/O(文件处理)

C 语言中的预处理器

C 预处理器 C #pragma 编译指示 C 预处理器操作符 C 宏 C 头文件

C 语言中的内存管理

C 内存管理 C 内存地址 C 存储类

C 其他主题

C 错误处理 C 可变参数 C 命令执行 C 数学函数 C static 静态关键字 C 随机数生成 C 命令行参数

C 语言编程资源

C 语言问题与解答答案 C 语言快速指南 C 语言速查表 C 语言实用资源 C 语言讨论


C 语言中的字符指针和函数

C 语言中的字符指针是什么?

字符指针存储字符类型的地址或字符数组(字符串)首字符的地址。字符指针在操作字符串时非常有用。

C 语言中没有字符串数据类型。"char"类型的数组被视为字符串。因此,char 类型数组的指针表示字符串。然后,可以将该 char 指针作为参数传递给函数来处理该字符串。

声明字符指针

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

char *pointer_name;

初始化字符指针

声明字符指针后,需要使用字符变量的地址对其进行初始化。如果存在字符数组,则只需提供字符数组的名称或其第一个元素的地址即可初始化字符指针。

字符的字符指针

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

char *pointer_name = &char_variable;

字符数组的字符指针

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

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

字符指针示例

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

#include <stdio.h>

int main() {
    // 声明两个变量
    char x = 'P';
    char arr[] = "TutorialsPoint";
    
    // 声明字符指针
  char *ptr_x = &x;
  char *ptr_arr = arr;

  // 打印值
  printf("Value of x : %c
", *ptr_x);
  printf("Value of arr: %s
", ptr_arr);
  
  return 0;
}

输出

运行代码并检查其输出 −

Value of x : P
Value of arr: TutorialsPoint

理解字符指针

字符串声明为数组,如下所示:-

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

访问字符数组

如果使用 %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" 头文件定义了许多执行字符串处理的库函数,例如查找字符串的长度、复制字符串以及比较两个字符串。这些函数使用字符指针参数。

strlen() 函数

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

int strlen(char *)

示例 1

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

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

int main(){

   char *ptr = "Hello";

   printf("Given string: %s 
", 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 
", 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() 函数

赋值运算符 ( = ) 不用于将字符串值赋给字符串变量(即字符指针)。相反,我们需要使用 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
");
   else if (ret > 0)
      printf("The first string appears after the second string 
");
   else
      printf("The first string appears before the second string 
");

   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
");
   else if (ret > 0)
      printf("The first string appears after the second string
");
   else
      printf("The first string appears before the second string
");

   return 0;
}

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

   // 如果两个字符串相等,则返回 0
   
   return 0;
}

运行此代码时,将产生以下输出 -

Both strings are identical

str_cmp() 函数比较字符串中相同索引处的字符,直到任一字符串中的字符用尽或字符相等。

当检测到相同索引处的字符不相等时,将返回它们的 ASCII 值之差。循环终止时返回"0"。