小型手机网站建设多少钱,西宁专业做网站公司,nike建设网站的目的,衡水网站建设培训学校【C语言】——字符串函数的使用与模拟实现#xff08;下#xff09; 前言五、长度受限类字符串函数5.1、 s t r n c p y strncpy strncpy 函数5.2、 s t r n c a t strncat strncat 函数5.3、 s t r n c m p strncmp strncmp 函数 六、 s t r s t r strstr strstr 函数6.1、函… 【C语言】——字符串函数的使用与模拟实现下 前言五、长度受限类字符串函数5.1、 s t r n c p y strncpy strncpy 函数5.2、 s t r n c a t strncat strncat 函数5.3、 s t r n c m p strncmp strncmp 函数 六、 s t r s t r strstr strstr 函数6.1、函数功能6.2、函数的使用6.3、函数的模拟实现1解题思路2代码实现 七、 s t r t o k strtok strtok 函数7.1、函数功能7.2、函数的使用 八、 s t r e r r o r strerror strerror 函数8.1、函数功能8.2、函数的使用 九、 p e r r o r perror perror 函数 前言 上一篇文章【C语言】——字符串函数的使用与模拟实现上中我曾详细介绍了 s t r s t r strstr strstr、 s t r c p y strcpy strcpy、 s t r c a t strcat strcat、 s t r c m p strcmp strcmp 这四个函数及其模拟实现接下来让我们继续学习字符串相关的函数吧。
五、长度受限类字符串函数
5.1、 s t r n c p y strncpy strncpy 函数 功能将源字符串的前 n u m num num 个字符拷贝到目标字符串中
如果源字符串长度小于 n u m num num则拷贝完源字符创后在目标空间后面追加\0直到 n u m num num 个。如果源字符串长度大于 n u m num num则在拷贝完源字符串前 n u m num num 个字符后末尾不会自动补 ‘\0’ 5.2、 s t r n c a t strncat strncat 函数 功能将源字符串的前 n u m num num个字符追加至目标字符串的末尾
如果源字符串长度大于 n u m num num追加前 n u m num num 个字符并在后面补\0如果源字符串长度小于 n u m num num追加整个源字符串并补\0。只补一个不会一直补到 n u m num num 个 5.3、 s t r n c m p strncmp strncmp 函数 功能比较 s t r 1 str1 str1 和 s t r 2 str2 str2 的前 n u m num num 个字符如果相等就继续往后比较最多比较 n u m num num 个字符如果提前发现不一样提前结束大的字符所在的字符串大于另外一个如果 n u m num num 个字符都相等就返回 0。 六、 s t r s t r strstr strstr 函数
6.1、函数功能 功能查找字符串 s t r 1 str1 str1 中是否包含字符串 s t r 2 str2 str2 的内容如果有返回第一次出现的地址如果没有返回空指针。
需要注意的是字符串的比较匹配不包含 ‘\0’以 ‘\0’ 作为结束标志。 6.2、函数的使用
#includestdio.h
#includestring.hint main()
{char str1[] This is a simple string;char* str2;str2 strstr(str1, simple);printf(%s\n, str2);for (int i 0; i strlen(simple); i){printf(%c, str2[i]);}printf(\n);str2 strstr(str1, are);printf(%s\n, str2);return 0;
}运行结果 6.3、函数的模拟实现
1解题思路 ( i ) (i) (i) 首先我们来看最简单的情况在 “ a b c d e f abcdef abcdef” 中找 “ c d e cde cde” 我们先来看上左图 s t r 1 str1 str1 和 s t r 2 str2 str2 指向两个字符串起始位置是我们传入的值这里我额外创建指针 c p cp cp 变量用指针 c p cp cp 来遍历 s t r 1 str1 str1 数组。看上右图当指针 c p cp cp 指向字符 ‘ c c c’ 时发现字符 ‘ c c c’ 与 s t r 2 str2 str2的首字符相同。为进一步确认 c p cp cp 与 s t r 2 str2 str2 同时遍历后面的字符每遍历一次相比较一次。当 s t r 2 str2 str2 遍历完字符串比较结束发现所比较的字符全部相等即找到 s t r 1 str1 str1 中的 s t r 2 str2 str2。 上面的思路看起来是可行的但是还是存在这很大的问题
函数要求的是返回地址也就是返回上面 ‘ c c c’ 字符的地址可是 c p cp cp 指针跑后面去了怎么返回他的地址呢想象一下当 c p cp cp 开始比较时与 s t r 2 str2 str2 的前几个字符是相等的但后面不相等这时是不是又要从‘c’的下一个字符重新开始比较但是 c p cp cp 与 s t r 2 str2 str2 都跑后面去了还怎么找到下一个字符呢 ( i i ) (ii) (ii) 下面我们来考虑复杂一点的情况在 “ a b b b c d f abbbcdf abbbcdf” 中找 “ b b c bbc bbc” 鉴于上述情况出现的两种问题我们再额外创建两个指针变量 s 1 s1 s1 与 s 2 s2 s2他们负责实现字符的逐个比较而 c p cp cp 与 s t r 2 str2 str2用于记录开始比较的起始位置。这样当 s 1 s1 s1 与 s 2 s2 s2 只有部分相等时依然可以找到下一个字符重新开始比较 ( i i i ) (iii) (iii) 再看最后一种情况如果找不到怎么办例如在 “ a b b b c abbbc abbbc” 中找 “ b b c c bbcc bbcc” 其实中不到的情况的解决思路与第二种情况时一样的不同的是当 c p cp cp 遍历完整个 s t r 1 str1 str1 字符串即 c p cp cp 指向 \0还没找到时即 s t r 1 str1 str1 中不存在 s t r 2 str2 str2 字符串返回空指针
2代码实现
char* my_strstr(const char* str1, const char* str2)
{//创建指针变量cp、s1、s2//因为并不知道什么时候开始比较s1、s2先置空const char* cp str1;const char* s1 NULL;const char* s2 NULL;//特殊情况当str2为空时返回整个str1if (str2 NULL){return (char*)str1;}//循环当cp指向‘\0’时退出表面没找到while (*cp){//进入逐个比较if (*cp *str2){//给s1、s2赋值让他们进行比较s1 cp;s2 str2;//如果他们相等并且不等于‘\0’比较继续while (*s1 ! \0 *s2 ! \0 *s1 *s2){s1;s2;}//退出比较时表明遇到不一样的字符//这时有两种情况//退出后当s2指向‘\0’时表明成功找到//当s2不是指向‘\0’表示并不是要找的字符串if (*s2 \0){return (char*)cp;}}cp;}//整个循环结束表明没找到返回空指针return NULL;}七、 s t r t o k strtok strtok 函数
7.1、函数功能 函数功能将 s t r str str 字符串 以字符 d e l i m i t e r s delimiters delimiters 作为分隔符分割成若干段。 s t r str str 参数表示要分割的字符串 d e l i m i t e r s delimiters delimiters 参数表示分隔符分隔符可以是多个 s t r t o k strtok strtok 函数找到 s t r str str 中的下一个标记并将其用 \0 结尾返回一个指向这段字符串的指针 s t r t o k strtok strtok 函数会改变被操作的字符串所以在使用 s t r t o k strtok strtok 函数切分的字符串一般都是临时拷贝的内容并且可以被修改 s t r t o k strtok strtok 函数的第一个参数不为NULL时函数将找到 s t r str str 中的第一个标记 s t r t o k strtok strtok 函数将保存它在字符串中的位置 s t r t o k strtok strtok 函数的第一个参数为NULL函数将在同一个字符串中被保存的位置开始查找下一个标记如果字符串不存在更多的标记则返回NULL指针 7.2、函数的使用 像 happyqq.com现在我想将 happy、qq、com 这三段单独提取出来这时就可以使用 s t r t o k strtok strtok函数
#includestdio.h
#includestring.hint main()
{char arr1[] happyqq.com;char arr2[30];const char* sep .;strcpy(arr2, arr1);char* ret NULL;ret strtok(arr2, sep);printf(%s\n, ret);ret strtok(NULL, sep);printf(%s\n, ret);ret strtok(NULL, sep);printf(%s\n, ret);ret strtok(NULL, sep);printf(%s\n, ret);return 0;
}运行结果 可以看到 s t r t o k strtok strtok 函数很奇怪只有第一次调用他是传的是要切割的字符串 a r r 2 arr2 arr2之后调用都是传 NULL。 这是因为该函数每一次调用该函数都把当前找的这个标记的结束位置记住这样下次再调用该函数就能从上次保存的位置开始找下一个标记 当第四次调用该函数时因为已经找到结束位置因此函数返回空指针。 注这里只是示范实际上是不允许这样打印的 当然上面的代码有很大的改进空间因为我们往往不知道有几个分隔符这时我们可以用一种巧妙的写法
#includestdio.h
#includestring.hint main()
{char arr1[] happyqq.comhappyqq.com;char arr2[30];const char* sep .;strcpy(arr2, arr1);char* ret NULL;for (ret strtok(arr2, sep); ret ! NULL; ret strtok(NULL, sep)){printf(%s\n, ret);}return 0;
}我们来分析一下for (ret strtok(arr2, sep); ret ! NULL; ret strtok(NULL, sep))这个循环
首先是初始化部分ret strtok(arr2, sep)将strtok(arr2, sep)的值传给 r e t ret ret 变量接着是判断部分ret ! NULL当 r e t ret ret 不为空时循环继续即打印该段字符串当返回值为空表示已经分割完字符串循环结束最后是调整部分ret strtok(NULL, sep)将strtok(NULL, sep)的返回值赋给 r e t ret ret 变量这个代码巧妙在 s t r t o k strtok strtok 函数要求第一次传的是字符串而之后传的是NULL这里完美运用了 f o r for for 循环的特点先初始化并且初始化只执行一次调整语句执行多次。 运行结果
八、 s t r e r r o r strerror strerror 函数
8.1、函数功能 功能把参数部分错误码对应的错误信息的字符串地址返回来 在不同的系统和 C 语言标准库中都规定了一些错误码一般放在 e r r n o . h errno.h errno.h 这个头文件中说明。 C语言程序启动时就会使用一个全面的变量 e r r n o errno errno 来记录程序当前的错误码只不过程序启动时 e r r n o errno errno 是 0表示没有错误。 当我们在使用标准库中的函数的时候发生了某种错误就会将对应的错误码放在errno中而一个错误码的数字是整数因此很难理解是什么意思所以每个错误码都是有对应的错误信息的。 s t r e r r o r strerror strerror 函数就可以将错误对应的错误信息字符串的地址返回。 8.2、函数的使用 我们打印 0 − 10 0-10 0−10 这些错误码所对应的信息
#includeerrno.h
#includestring.h
#includestdio.hint main()
{int i 0;for (i 0; i 10; i){printf(%s\n, strerror(i));}return 0;
}运行结果 再比如我们以读的方式打开一个不存在的文件让其返回错误信息
#includeerrno.h
#includestring.h
#includestdio.hint main()
{FILE* pFile;pFile fopen(unexist.ent, r);if (NULL pFile){printf(Error opening file unexist.ent: %s\n, strerror(errno));}return 0;
}运行结果 九、 p e r r o r perror perror 函数 功能 p e r r o r perror perror 函数相当于 p e i n t f s t r e r r o r peintfstrerror peintfstrerror它会打印完参数本分的字符串内容后再打印一个冒号和一个空格再打印错误信息。
例如
#includeerrno.h
#includestring.h
#includestdio.hint main()
{FILE* pFile;pFile fopen(unexist.ent, r);if (NULL pFile){perror(Error opening file unexist.ent);}return 0;
}运行结果 好啦本期关于部分字符串函数的介绍及模拟实现就介绍到这里啦希望本期博客能对你有所帮助更多关于字符串的函数还请收看下一期。同时如果有错误的地方请多多指正让我们在C语言的学习路上一起进步