字符串函数以及内存操作函数

简介: 字符串函数以及内存操作函数

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


相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
154 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
22天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
19 0
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
39 0
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
64 0
|
1月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
65 0
|
1月前
|
编译器 C语言 C++
【C语言】精妙运用内存函数:深入底层逻辑的探索
【C语言】精妙运用内存函数:深入底层逻辑的探索