C库字符串函数介绍

1、strstr()

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

下面是 strstr() 函数的声明。

char *strstr(const char *haystack, const char *needle)

参数

  • haystack -- 要被检索的 C 字符串。
  • needle -- 在 haystack 字符串内要搜索的小字符串。

返回值

该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。

返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。

需要注意的是haystack的长度要大于needle

示例1:

输出:str str2 str1

示例2:

char str[]="1234xyz";

char *str1=strstr(str,"34");

cout 

输出: 34xyz

2、char *和char[]的区别是什么

在C和C++中,char*char[]都用于表示字符数组,但它们之间存在一些重要的区别:

  1. 存储char*是一个指向字符的指针,它只存储了一个地址,这个地址通常指向一个字符串常量或者动态分配的内存。另一方面,char[]是一个真正的字符数组,它存储了一串字符。
  2. 生命周期char[]的内存是在栈上分配的,其生命周期与包含它的函数或代码块一致。当函数或代码块执行完毕,该内存将被自动释放。另一方面,char*可以指向动态分配的内存,其生命周期取决于程序员如何管理它。如果程序员忘记释放内存,可能会导致内存泄漏。
  3. 字符串常量:当char*指向一个字符串常量时,例如char* s = "Hello";,实际上s只是一个指向字符串常量的指针。字符串常量是不可修改的,试图修改它会导致未定义行为。这种情况下,使用const char*更安全。另一方面,char[]可以创建一个可以修改的字符串。

下面是一些例子来说明这些区别:

// char* example 
char* s1 = "Hello"; // s1 is a pointer to a string literal 
printf("%s\n", s1); // Prints "Hello" 


// char[] example 
char s2[] = "Hello"; // s2 is an array of characters 
printf("%s\n", s2); // Prints "Hello" 


// Modifying a char* 
char* s3 = malloc(6 * sizeof(char)); // Allocate memory dynamically 
strcpy(s3, "Hello"); // Copy the string "Hello" into the memory pointed by s3 
s3[0] = 'h'; // Modifying the first character of the string 
printf("%s\n", s3); // Prints "hello" 
free(s3); // Don't forget to free the memory! 


// Modifying a char[] 
char s4[] = "Hello"; // s4 is an array of characters, including the '\0' terminator 
s4[0] = 'h'; // Modifying the first character of the string 
printf("%s\n", s4); // Prints "hello"

注意:在C++中,推荐使用std::string来处理字符串,因为它提供了更安全、更高效的方式来处理字符串。

C字符串

在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。

下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符 \0,所以字符数组的大小比单词 RUNOOB 的字符数多一个。

char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};

依据数组初始化规则,您可以把上面的语句写成以下语句:

char site[] = "RUNOOB";

其实,您不需要把 null 字符放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 \0 放在字符串的末尾。让我们尝试输出上面的字符串:

在使用不定长数组初始化字符串时默认结尾为 \0

char greeting[] = "Hello";
printf("Greeting message: %s, greeting[] Length: %d\n", greeting, sizeof(greeting));

输出结果:

Greeting message: Hello, greeting[] Length: 6

字符数组如果不预留'0'编译器会报错,如下图所示

再如

C 中有大量操作字符串的函数:

序号函数 & 目的
1strcpy(s1, s2);
复制字符串 s2 到字符串 s1。
2strcat(s1, s2);
连接字符串 s2 到字符串 s1 的末尾。
3strlen(s1);
返回字符串 s1 的长度。
4strcmp(s1, s2);
如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

其中函数的英文全称为

strcmp: string compare 

strcat: string catenate   字符串连接

strcpy: string copy 

strlen: string length 

strlwr: string lowercase 

strupr: string upercase

下面的实例使用了上述的一些函数:

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[14] = "runoob";
   char str2[14] = "google";
   char str3[14];
   int  len ;
 
   /* 复制 str1 到 str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );
 
   /* 连接 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );
 
   /* 连接后,str1 的总长度 */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );
 
   return 0;
}

转载自:C 字符串 | 菜鸟教程 (runoob.com)