字符串函数详解(看这一篇就足够了)(下)

简介: 字符串函数详解(看这一篇就足够了)(下)

字符串函数详解(看这一篇就足够了)(上):https://developer.aliyun.com/article/1624349


2.7 strncmp

int strncmp ( const char * str1, const char * str2, size_t num );
#include <stdio.h>
int main(){
char str1[] = "Hello";
char str2[] = "Hell";
int result = strncmp(str1, str2, 4);
if (result == 0) {
  printf("Strings are equal");
} else if (result < 0) {
  printf("str1 is less than str2");
} else {
  printf("str1 is greater than str2");
  }
return 0;
}
//运行结果:Strings are equal

 

  • 注意事项
  • num参数指定要比较的字符数,如果两个字符串的前n个字符完全相等,则返回0。
  • 如果要比较的字符数大于字符串的长度,则会比较整个字符串。

知识补充

在C语言中,空字符是指ASCII码为0的字符,它表示字符串的结束。在字符串中,空字符(\0)用于标记字符串的结束,因此也被称为字符串结束符。

2.8 strstr 字符串查找

char * strstr ( const char * str1, const char * str2);

Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.

(函数返回字符串str2在字符串str1中第⼀次出现的位置)。

The matching process does not include the terminating null-characters, but it stops there.(字符

串的比较匹配不包含 \0 字符,以 \0 作为结束标志)。

函数实现

#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
printf("%s\n", pch);
return 0;
}
//运行结果: simple string

模拟实现(暴力模拟)

1.一次匹配就成功 2.多次匹配 3.没有找到

需要指针记录开始匹配的位置,记录起始位置。

#include <stdio.h>
//#include <string.h>
char * strstr (const char * str1, const char * str2){
    const char*s1=NULL;
    const char*s2=NULL;
    const char*cur=str1;
    if(*str2=='\0'){
        return (char *)str1;
    }
    while(*cur){
         s1=cur;
         s2=str2;
         while(*s1!='\0' && *s2!='\0' && *s1==*s2){
             s1++;
             s2++;
         }
         if(*s2=='\0'){
             return (char*)cur;
    }
    cur++;
    }
    return NULL;
}
int main(){
    char str1[100];
    char str2[100];
    scanf("%s",str1);
    scanf("%s",str2);
    printf("%s\n",strstr(str1,str2));
}

2.9 strtok

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

1.sep参数指向一个字符串,定义了用作分隔符的字符集合

2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标

记。

3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:

4.strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容

并且可修改。)

5.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串

中的位置。

6.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标

记。

如果字符串中不存在更多的标记,则返回 NULL 指针.

#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "192.168@6.111*98896";
char* sep = ".@*";
char* str = NULL;
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
 {
 printf("%s\n", str);
 }
 return 0;
}

2.10  strerror

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明 的,C语言程序启动的时候就会使用⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误就会讲对应 的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印下0~10这些错误码对应的信息
int main()
{
int i = 0;
for (i = 0; i <= 10; i++) {
printf("%d->%s\n", i,strerror(i));
}
return 0;
}
/*
0->No error
1->Operation not permitted
2->No such file or directory
3->No such process
4->Interrupted function call
5->Input/output error
6->No such device or address
7->Arg list too long
8->Exec format error
9->Bad file descriptor
10->No child processes
*/

实例

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
 FILE * pFile;
 pFile = fopen ("unexist.ent","r");
 if (pFile == NULL)
 printf ("Error opening file unexist.ent: %s\n", strerror(errno));
 return 0;
}
//运行结果:Error opening file unexist.ent: No such file or directory

知识补充

perror函数,perror 函数直接将错误信息打印出来。perror函数打印完参数部分的字符串后,再打印一个冒号和一个空格,再打印错误信息。

相当于 printf+strerror

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE * pFile= fopen ("unexist.ent","r");
if (pFile == NULL)
perror("Error opening file unexist.ent");
return 0;
}
//运行结果;Error opening file unexist.ent: No such file or directory

OK,本次内容到此结束,字符串函数差不多都是这些,希望大家多多支持小编!

目录
相关文章
|
12月前
|
C语言 C++
C/C++字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数
C/C++字符函数和字符串函数模拟实现与详解————长度不受限制的字符串函数
49 0
|
2天前
|
自然语言处理 C语言 开发者
字符串函数详解(看这一篇就足够了)(上)
字符串函数详解(看这一篇就足够了)(上)
17 2
|
2月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
55 0
|
4月前
|
安全 编译器 C语言
【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数
【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数
|
12月前
|
C语言 C++
C/C++字符函数和字符串函数详解————内存函数详解与模拟
C/C++字符函数和字符串函数详解————内存函数详解与模拟
46 1
|
12月前
|
编译器 C++
长度不受限制的字符串函数【详解+模拟实现】
长度不受限制的字符串函数【详解+模拟实现】
|
C语言
学C的第二十八天【字符串函数和内存函数的介绍(一)】-1
前言: (1). C语言中对于字符和字符串的处理很是频繁,但是C语言本身没有字符串类型,字符串通常放在 常量字符串 中或者 字符数组 中。
|
C语言
学C的第二十八天【字符串函数和内存函数的介绍(一)】-2
(6). strncat()函数:追加字符串的num个字符到另一字符串 函数返回值类型和相关参数: