c语言:字符串和内存函数介绍-2

简介: c语言:字符串和内存函数介绍

c语言:字符串和内存函数介绍-1

https://developer.aliyun.com/article/1515640


9、strtok

  • strtok 函数定义
char * strtok ( char * str, const char * sep );


  • sep所指向的字符串,定义了在str中当作分割符的字符集合,strtok函数通过sep找到str中的分隔符,将其标记并改为

'\0',然后返回这个标记的指针。(strtok函数会改变str所指向的字符串,所以参数一般都是目标字符串的临时拷贝)

  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置
  • strtok函数第一参数若为空指针,函数将在同一个字符串中被保存的位置开始,查找下一个分隔符并标记返回该标记所指向的下一个元素的指针。
  • 举例:
#include<stdio.h>
#include<string.h>
int main()
{
  char arr[] = { "xx?abc{ddf+ll" };
  char* p = arr;
  char sep[] = { "?{+" };
  char*ret=strtok(p, sep);
  printf("%s\n", ret);
  ret = strtok(NULL, sep);
  printf("%s\n", ret);
  ret = strtok(NULL, sep);
  printf("%s\n", ret);
  return 0;
}

10、strerror

  • 返回错误码,所对应的错误信息(必须包含头文件string.h,stdio.h,与errno.h)


  • strerror函数定义为

  errnum为错误码,不同的错误码对应着不同的错误信息;当错误信息生成的时候就会被保存在errnum当中,识别errnum当中的错误码信息就可以查找解决对应的问题。

char * strerror ( int errnum );
  • 演示:
#include<errno.h>
#include<string.h>
#include<stdio.h>
int main()
{
printf("%s\n",strerror(0));
printf("%s\n",strerror(1));
printf("%s\n",strerror(2));
printf("%s\n",strerror(3));
printf("%s\n",strerror(4));
return 0;
}


27fd8a2c90c5d3cf476694c3ee38608f_36eb517ed3b645cd886607567477489a.png

11、常见字符分类函数(islower,isupper,isdigit等)

举例,就拿isdigit函数来说,此类函数包含于头文件ctype.h中;当判断为是数字字符时,isdigit函数返回非0的数字,当判断为非数字字符的时候,返回数字0;

#include<stdio.h>
#include<ctype.h>
int main()
{
 
  char ch = 'a';
  int flag = isdigit(ch);
  if (flag)
    printf("YES\n");
  else
    printf("NO\n");  //打印结果为NO;
    return 0;
}


一些其他的分类函数(表格);返回值和类型与上述相当;

isdigit 判断是否为0~9的十进制数字
isxdigit 判断是否为十六进制(包含十进制和大小写字母)
islower 判断是否为小写字母
isupper 判断是否为大写字母
isalpha 判断是否为大小写字母
isalnum 判断是否为字母或者数字
ispunct 判断是否为标点符号已经任何数字或字母的图形字符
isgraph 判断是否为任何图形字符
isprint 判断是否为任何可打印字符(包括图形和空白字符)


12、字符转换函数(tolower以及toupper)

  • 函数定义为:
1. int tolower ( int c );
2. int toupper ( int c );


  • 使用:(此处将返回值改为大写,并未转变原字符串)
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="abcdef ABCDEF.\n";
  char c;
  while (str[i])
 {
    c=str[i];
    if (isupper(c)) 
        c=tolower(c);
    putchar (c);
    i++;
 }
  return 0;
}


a94be1b20946fefd794b22acbf0897ed_bc50bb6e7170413696e13475a7cd4f36.png

13、memcpy函数(memmove,memcpy的重叠用法)

  • 函数定义为:
void * memcpy ( void * destination, const void * source, size_t num );



  • 函数memcpysource的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果sourcedestination有任何的重叠,复制的结果都是未定义的。
  • 举例:(其他类型的数据同样如此)
#include<stdio.h>
#include<string.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int brr[10] = {0};
  memcpy(brr, arr, 20);
  //这里将arr的前五个元素拷贝到brr中;
  for (int i = 0;i < 10;i++)
    printf("%d ", brr[i]);
  return 0;
}

12ef1b6a0f3d5e7ce169cc32cd7af32f_08b5aa1792b643909fe2873ff489e06d.png

  • 模拟实现memcpy(同时也是memmove的实现):
#include<stdio.h>
 
void* my_memcpy(void *dest, void *str, size_t n)
{
  void* ret = dest;
  if (dest < str)
  {
    while (n--)
    {
      *(char*)dest = *(char*)str;
      dest = (char*)dest + 1;
      str = (char*)str + 1;
 
    }
  }
  else
  {
    
    while (n--)
    {
      *((char*)dest + n) = *((char*)str + n);
      
    }
  }
  return ret;
}
 
 
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int brr[5] = { 0 };
  my_memcpy(arr+2, arr, 20);
  for (int i = 0;i < 10;i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}


14、memcmp

  • memcmp函数定义 :
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  • 类似于strcmp,这里num来控制两个字符串比较的长度(单位字节),返回值类似于strcmp。


str1   ? str2       返回值
      >       >0
      <       <0
      =       =0


举例:

#include<stdio.h>
#include<string.h>
int main()
{
    int str1[] =    { 1,2,3,4,5,6,7 };
    int str2[] =    { 1,2,3,4,7,6,6 };
   int ret= memcmp(str1, str2,20 );
 
   if (ret > 0)
       printf("str1>str2\n");
   else if (ret < 0)
       printf("str1<str2\n");
   else
       printf("str1=str2\n");
    return 0;
}
//运行结果为 str1 < str2


目录
相关文章
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
66 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
52 9
|
1月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
41 8
|
1月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
50 6
|
1月前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
261 6
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
64 6
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
357 1
|
30天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
25 3