Cprogramming 简明教程
Character Pointers and Functions in C
What is a Character Pointer in C?
character pointer 存储字符类型或字符数组第一个字符的地址 ( string )。当您需要操作字符串时,字符指针非常有用。
C 中没有 string 数据类型。“char”类型的数组被视为一个字符串。因此,char 类型数组的指针表示一个字符串。然后,将此 char 指针作为一个 function 的参数传递,以处理字符串。
Initializing a Character Pointer
在声明字符指针之后,您需要使用字符变量的地址对其进行初始化。如果存在字符数组,您可以简单地通过提供字符数组的名称或其第一个元素的地址来初始化字符指针。
Character Pointer Example
#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;
}
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 格式说明符打印字符数组,您可以使用字符指针的名称。但是,如果您想访问字符数组的每个字符,您必须在字符指针名称前面使用星号 (*) 然后增加它。
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() function 有 three possible return values −
-
当发现两个字符串都 identical ,它会返回“0”。
-
当 str1 中第一个不匹配的字符有比在 str2 中相应字符更大的 ASCII 值时,该函数 returns a positive integer 。它意味着按照字典顺序,str1 出现于 str2 之后。
-
当 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”。