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