字符串函数(4)--strtok函数和strerror函数

简介: 1.strstok函数的用法 直接看函数的声明:参数1:要切割的地址,参数2:切割时的标记物注意:strtok函数本身会记住第一次传过来的这个地址,第一次传过来时:如果这个地址为空,则strtok函数返回一个空指针,如果这个地址不为空,则返回传过来的首地址。由于这个函数的第二个参数为要切割的标记物,假如这个标记物不存在,返回的也是第一次传进来的要切割的函数的首地址。下面举例说明:

1.strstok函数的用法

char* strtok(char* str, const char* delimiters);

直接看函数的声明:

参数1:要切割的地址,参数2:切割时的标记物


注意:strtok函数本身会记住第一次传过来的这个地址,第一次传过来时:如果这个地址为空,则strtok函数返回一个空指针,如果这个地址不为空,则返回传过来的首地址。


由于这个函数的第二个参数为要切割的标记物,假如这个标记物不存在,返回的也是第一次传进来的要切割的函数的首地址。


下面举例说明:

int main()
{
  char arr[] = "abcd@.dde.agc";
  //192.168.31.121
  //ip地址:点分十进制的表示方式
  char* p = "--";  // 标记物
  char* ret = NULL;
  for (ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p))
  { //这个函数自己会识别上一次标记的位置
    printf("%s\n",ret);
  }
}

b51772fdc05e4f76a36152a165122001.png

找不到标记物,返回的是字符串的首地址。

那要是找到了标记物呢?

打印出来的结果是这样的:

eac503830ae64652b5544adf44c7a649.png

调试后发现:

b32b8af36c224380903f20dcdb41a271.png

第一次切割时,标记物的位置被改成了 ‘\0’

你可能会问,在循环内部,为什么 是 ret = strtok (NULL,p) 呢?传递的不应该是arr吗,

是的,传递的确实不是arr,而是 NULL,为什么呢?


是因为strtok函数内部,在第一次接收到字符串的地址后,当它切割成功时,会自己记住这个切割点的位置,下一次调用这个函数时,它会记住这个位置并且从该位置的下一个位置开始寻找切割物。


这就是为什么第二次及以后调用strtok函数时,传递的第一个参数是NULL的原因。


当我们进行第二次切割时,会发现一个奇怪的问题:

为什么第二次切割没有将第一个@后的 . 改成 ‘\0’ ?,而是在之后的 . 改成 ‘\0’ 呢?

如下图:

9dc20e214969458c83a287c08ca36101.png

进一步探讨后发现:

6784f724751c47a9b7509384bc43ded6.png

当第一次切割成功后,第二次切割时,我们知道,这个函数会记住上一次切割点并从下一个位置开始寻找切割点,然而,当这所谓的下一个位置,是切割点时,这个函数直接不理,不改成 ‘\0’,直接跳过继续寻找,知道找到的字符不是切割标记字符时,从这以后,才开始真正意义上的找切割点,并更改为 \0

也就是说,第一次切割成功后,abcd@.@@中的第一个@,被改成了 ‘\0’,第二次调用该函数时, .@@不会被改成 ‘\0’,而是直接跳过,继续寻找,知道找到不是切割物的字符。

看到这里,你应该明白了strtok函数的使用方法。

2.strerror函数的使用方法

strerror–错误报告函数,它会返回错误码,所对应的错误信息

  错误码  错误信息
  0   No error
  1   Operation not permitted
  2   No such file or directory
  errno : 是一个全局的错误码的变量
当c语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errmo中

举例:

int main()
{
  FILE* fp = fopen("text.txt", "r");
  if (fp == NULL)
  {
    printf("%s\n", strerror(errno));
  }
  else
  {
    printf("open file successfully\n");
  }
}

当我们打开文件时,由于电脑中没有这个文件,故会返回错误报告:

cc31b2e78b25441eaadb7183826afb7c.png

将errno放在strerror中,是为了将该错误码所对应的错误信息放到strerror中,以便返回来打印。

该函数的使用方法就这么简单,一般是配合打开文件等操作使用。

相关文章
|
8天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现2
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
2天前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(上)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
10 0
|
2天前
|
安全 C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(中)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
13 0
|
2天前
|
C语言
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror(下)
C语言进阶⑬(字符串函数)+(指针编程题)strlen+strcpy+strcat+strstr+strtok+strerror
6 0
|
8天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
8天前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
8天前
|
C语言
深入理解字符串函数(strstr、strtok、strerror)(二)
深入理解字符串函数(strstr、strtok、strerror)(二)
|
5月前
|
安全 C语言
strtok()函数的使用方法
strtok()函数的使用方法
56 0
|
9月前
|
编译器 C语言
【C语言进阶】字符函数及字符串函数,带你掌握核心用法并模拟实现(1)——strlen,strcpy,strcmp
【C语言进阶】字符函数及字符串函数,带你掌握核心用法并模拟实现(1)——strlen,strcpy,strcmp
96 1
|
10月前
|
C语言
strstr函数strtok函数strerror函数详解【C语言】
strstr函数strtok函数strerror函数详解【C语言】

热门文章

最新文章