赞
踩
C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
下面是 strstr() 函数的声明。
char *strstr(const char *haystack, const char *needle)
参数
返回值
该函数返回在 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
在C和C++中,char*
和char[]
都用于表示字符数组,但它们之间存在一些重要的区别:
char*
是一个指向字符的指针,它只存储了一个地址,这个地址通常指向一个字符串常量或者动态分配的内存。另一方面,char[]
是一个真正的字符数组,它存储了一串字符。char[]
的内存是在栈上分配的,其生命周期与包含它的函数或代码块一致。当函数或代码块执行完毕,该内存将被自动释放。另一方面,char*
可以指向动态分配的内存,其生命周期取决于程序员如何管理它。如果程序员忘记释放内存,可能会导致内存泄漏。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 语言中,字符串实际上是使用空字符 \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 中有大量操作字符串的函数:
序号 | 函数 & 目的 |
---|---|
1 | strcpy(s1, s2); 复制字符串 s2 到字符串 s1。 |
2 | strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。 |
3 | strlen(s1); 返回字符串 s1 的长度。 |
4 | strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
5 | strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
6 | strstr(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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。