字符串函数详解(看这一篇就足够了)(上):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