1.字符串函数
1.1
strlen(求字符串长度)
描述
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
声明
下面是 strlen() 函数的声明。
size_t strlen(const char *str)
参数
- str -- 要计算长度的字符串。
返回值
该函数返回字符串的长度。
实例
下面的实例演示了 strlen() 函数的用法。
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
int len;
strcpy(str, "This is runoob.com");
len = strlen(str);
printf("|%s| 的长度是 |%d|\n", str, len);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
1.2
strcpy(实现对原有字符串复制)
描述
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
声明
下面是 strcpy() 函数的声明。
char *strcpy(char *dest, const char *src)
参数
- dest -- 指向用于存储复制内容的目标数组。
- src -- 要复制的字符串。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
实例
下面的实例演示了 strcpy() 函数的用法。
实例 1
#include <stdio.h> #include <string.h>
int main() {
char src[40];
char dest[100];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strcpy(dest, src);
printf("最终的目标字符串: %s\n", dest); return(0); }
让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: This is runoob.com
实例 2
#include <stdio.h> #include <string.h>
int main ()
{ char str1[]="Sample string";
char str2[40]; char str3[40];
strcpy (str2,str1);
strcpy (str3,"copy successful");
printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
return 0; }
让我们编译并运行上面的程序,这将产生以下结果:
str1: Sample string
str2: Sample string
str3: copy successful
1.3
strcat(实现对原有字符串内容的追加)
描述
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
声明
下面是 strcat() 函数的声明。
char *strcat(char *dest, const char *src)
参数
dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
src -- 指向要追加的字符串,该字符串不会覆盖目标字符串。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
实例
下面的实例演示了 strcat() 函数的用法。
实例
#include <stdio.h> #include <string.h>
int main ()
{ char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
printf("最终的目标字符串: |%s|", dest);
return(0); }
让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: |This is destinationThis is source|
1.4
strcmp(比较两个字符串的大小)
描述
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
声明
下面是 strcmp() 函数的声明。
int strcmp(const char *str1, const char *str2)
参数
str1 -- 要进行比较的第一个字符串。
str2 -- 要进行比较的第二个字符串。
返回值
该函数返回值如下:
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。
实例
下面的实例演示了 strcmp() 函数的用法。
实例
#include <stdio.h> #include <string.h>
int main ()
{ char str1[15];
char str2[15]; int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strcmp(str1, str2);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{ printf("str1 大于 str2");
} else
{ printf("str1 等于 str2"); } return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
str1 大于 str2
1.5strncpy(实现对指定长度的字符串进行复制)
描述
C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
声明
下面是 strncpy() 函数的声明。
char *strncpy(char *dest, const char *src, size_t n)
参数
dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。
n -- 要从源中复制的字符数。
返回值
该函数返回最终复制的字符串。
实例
下面的实例演示了 strncpy() 函数的用法。在这里,我们使用函数 memset() 来清除内存位置。
实例
#include <stdio.h> #include <string.h>
int main()
{ char src[40];
char dest[12];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strncpy(dest, src, 10);
printf("最终的目标字符串: %s\n", dest);
return(0); }
让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: This is ru
1.6strncmp(对指定长度的字符串进行比较大小)
描述
C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。
声明
下面是 strncmp() 函数的声明。
int strncmp(const char *str1, const char *str2, size_t n)
参数
str1 -- 要进行比较的第一个字符串。
str2 -- 要进行比较的第二个字符串。
n -- 要比较的最大字符数。
返回值
该函数返回值如下:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str2。
如果返回值 = 0,则表示 str1 等于 str2。
实例
下面的实例演示了 strncmp() 函数的用法。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strncmp(str1, str2, 4);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str2 小于 str1");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
str2 小于 str1
1.7strncat(实现指定长度的字符串的追加)
描述
C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
声明
下面是 strncat() 函数的声明。
char *strncat(char *dest, const char *src, size_t n)
参数
dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
src -- 要追加的字符串。
n -- 要追加的最大字符数。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
实例
下面的实例演示了 strncat() 函数的用法。
#include <stdio.h>
#include <string.h>
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strncat(dest, src, 15);
printf("最终的目标字符串: |%s|", dest);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: |This is destinationThis is source|
1.8
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。
实例
下面的实例演示了 strstr() 函数的用法。
实例
#include <stdio.h> #include <string.h>
int main()
{
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret; ret = strstr(haystack, needle);
printf("子字符串是: %s\n", ret); return(0); }
让我们编译并运行上面的程序,这将产生以下结果:
子字符串是: NOOB
涉及到的相关内容:kmp算法:什么是KMP算法(详解)_攻城狮百里的博客-CSDN博客_kmp算法
1.9 strtok(分隔符函数)
描述
C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。
声明
下面是 strtok() 函数的声明。
char *strtok(char *str, const char *delim)
参数
str -- 要被分解成一组小字符串的字符串。
delim -- 包含分隔符的 C 字符串。
返回值
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。
实例
下面的实例演示了 strtok() 函数的用法。
实例
#include <string.h> #include <stdio.h>
int main ()
{ char str[80] = "This is - www.runoob.com - website";
const char s[2] = "-"; char *token; /* 获取第一个子字符串 */
token = strtok(str, s); /* 继续获取其他的子字符串 */
while( token != NULL )
{ printf( "%s\n", token );
token = strtok(NULL, s);
}
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
This is
www.runoob.com
website
1.10strerror(查找错误信息)
描述
C 库函数 char *strerror(int errnum) 从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。strerror 生成的错误字符串取决于开发平台和编译器。
声明
下面是 strerror() 函数的声明。
char *strerror(int errnum)
参数
- errnum -- 错误号,通常是 errno。
返回值
该函数返回一个指向错误字符串的指针,该错误字符串描述了错误 errnum。
实例
下面的实例演示了 strerror() 函数的用法。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE *fp;
fp = fopen("file.txt","r");
if( fp == NULL )
{
printf("Error: %s\n", strerror(errno));
}
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果,因为我们尝试打开一个不存在的文件:
Error: No such file or directory
2.内存操作函数
内存操作函数相对于字符串函数而言,由于其参数类型为void*,能够对其他数据类型进行操作
2.01
memset(实现对内容的重置)
描述
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
声明
下面是 memset() 函数的声明。
void *memset(void *str, int c, size_t n)
参数
- str -- 指向要填充的内存块。
- c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。
- n -- 要被设置为该值的字符数。
返回值
该值返回一个指向存储区 str 的指针。
实例
下面的实例演示了 memset() 函数的用法。
实例
#include <stdio.h> #include <string.h>
int main ()
{ char str[50];
strcpy(str,"This is string.h library function");
puts(str);
memset(str,'$',7);
puts(str); return(0); }
让我们编译并运行上面的程序,这将产生以下结果:
This is string.h library function
$$$$$$$ string.h library function
2.02
memcpy(对内容的复制)
描述
C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
声明
下面是 memcpy() 函数的声明。
void *memcpy(void *str1, const void *str2, size_t n)
参数
str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
n -- 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
实例
下面的实例演示了 memcpy() 函数的用法。
实例
// 将字符串复制到数组 dest 中
#include <stdio.h> #include <string.h>
int main ()
{ const char src[50] = "http://www.runoob.com";
char dest[50];
memcpy(dest, src, strlen(src)+1);
printf("dest = %s\n", dest);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
dest = http://www.runoob.com
将 s 中第 11 个字符开始的 6个连续字符复制到 d 中:
实例
#include <stdio.h> #include<string.h>
int main()
{ char *s="http://www.runoob.com";
char d[20]; memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob) // 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
d[6]='\0';
printf("%s", d);
return 0;
}
让我们编译并运行上面的程序,这将产生以下结果:
runoob
覆盖原有部分数据:
实例
#include<stdio.h> #include<string.h>
int main(void) { char src[] = "***";
char dest[] = "abcdefg";
printf("使用 memcpy 前: %s\n", dest);
memcpy(dest, src, strlen(src));
printf("使用 memcpy 后: %s\n", dest);
return 0;
}
让我们编译并运行上面的程序,这将产生以下结果:
使用 memcpy 前: abcdefg
使用 memcpy 后: ***defg
2.03memmove(实现对内容的复制)
描述
C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
声明
下面是 memmove() 函数的声明。
void *memmove(void *str1, const void *str2, size_t n)
参数
str1 -- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 -- 指向要复制的数据源,类型强制转换为 void* 指针。
n -- 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。
实例
下面的实例演示了 memmove() 函数的用法。
#include <stdio.h>
#include <string.h>
int main ()
{
const char dest[] = "oldstring";
const char src[] = "newstring";
printf("Before memmove dest = %s, src = %s\n", dest, src);
memmove(dest, src, 9);
printf("After memmove dest = %s, src = %s\n", dest, src);
return(0);
}
让我们编译并运行上面的程序,这将产生以下结果:
Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring