C语言字符串函数(2)受限制的字符串函数

前言:

        之前我介绍了四个常用字符串函数的使用方法和自定义模拟实现,大家感兴趣的话去看一看作者的上一篇文章:

字符串函数(1)strlen,strcpy,strcat,strcmp等函数的使用_

       

        接下来我会讲一讲strncpy、strncat、strncmp三个函数的使用方法! 这三个函数与我上一篇文章中介绍到的三个strcpy、strcat、strcmp函数同根同源,实属一家。唯一不同的是,接下来讲的这三个函数都多添加了一个参数:size_t num ,这使得我们可以控制函数执行过程中的一些内容,限制了程序的执行条件,可以给程序猿带来了很大的方便!

目录

一.受限制的字符串函数

1.strncpy——字符串拷贝函数

2.strncat追加字符串函数

3.strncmp字符串比较函数


一.受限制的字符串函数

以下字符串均是<string.h>库中的函数,使用时要引头文件!!!

1.strncpy——字符串拷贝函数

Copy characters of one string to another.意为:将一个字符串的字符复制到另一个字符串

       char* strDestination:目的地指针,被拷贝的字符串

        const char* strSource:源头指针,拷贝的字符串(不可修改)

        size_t count 表明我们可以控制源头字符串拷贝多少个字节数过去,count的单位是字节数,而char型字符所占空间为一个字节,那么我们也可以理解为count可以控制源头字符串拷贝多少字符到目的地字符串。

        使用strncpy的注意事项:

注:strncpy可以设置拷贝字符的大小。(在不越界数组长度的前提下,arr1想拷贝几个字符过去就拷贝几个字符过去)

        目的地的空间必须足够大,否则会出错。

举个例子代码:

int main() {
	char arr1[7] = "hello.";
	strncpy(arr1, "world!", 6);
	printf("%s\n", arr1); 
    return 0;
    }

        代码讲解:strncpy中的参数表明字符串"world!"要拷贝到arr1中,且设置了拷贝字符的个数为前6个,那么拷贝过去的字符为:‘w','o','r','l','d','!' 。覆盖掉目的地字符串原本的 'h', 'e', 'l', 'l', 'o', '.' 六个字符,但arr1中的 '\0'字符还在,没有被覆盖掉。                

        这就是strcpy与strncpy的区别:strcpy会一股脑把源头字符串所有字符(包括'\0')全都拷贝到目的地字符串;而strncpy会控制拷贝字符的个数,让我们想拷贝几个字符就拷贝几个字符。


练习1.

char arr2[] = "hello.";
	strncpy(arr2, "world!", 4);				
	printf("%s\n", arr2);

  代码讲解:

        程序将字符串"world!"拷贝到arr2中,控制了源头字符串传输的个数为4,那么传输过去的只有:'w','o','r','l' 四个字符,从而覆盖掉hell。最终令arr2变成"worlo."


  练习2.

	char arr3[5] = "bit";
	strncpy(arr3, "hahaha!", 7);
	printf("%s\n", arr3);

代码讲解:

        arr3的大小为5,而字符串"hahaha!"共有8个字符(外加'\0'),越界拷贝,发生冲突
        所以要注意,目的地的空间必须足够大


2.strncat追加字符串函数

       size_t count 可自主追加字符的个数

        char* strDestination:目的地指针,被拷贝的字符串

        const char* strSource:源头指针,拷贝的字符串(不可修改)

        函数实现原理:源头的字符串,会先找到目的地字符串的末尾结束标志'\0'字符,然后源头会将其'\0'字符覆盖掉,根据给出的追加的前count个字节数向目的地字符串中追加源头的字符 。

        如果count大于字符串src的长度,那么函数仅将src全部追加到dest的尾部;

        如果count小于src的字符数,函数只会将src的前count个字符附加在dest末尾。

        无论哪种情况,都会在新字符串的末尾自动添加'\0'字符。

1.使用代码

int main() {
	char arr1[20] = "sky is";
	strncat(arr1, "blue",4);
	printf("%s\n", arr1);

        追加的内容会找到arr1字符串中末尾的'\0'字符,将b字符替换掉'\0'开始向后追加,追加四个字符个数,那么是把 b l u e四个字符追加过去,且在末尾顺带一个'\0'字符,结束追加。 


        练习2.

char arr2[20] = "hello ";
	char arr3[] = "bit!";
	strncat(arr2, arr3, 5);
	printf("arr2:%s\n", arr2);//"hello bit!"
	printf("----------------------------------------\n");


练习3.        


	char arr4[20] = "abcdef";
	strncat(arr4, arr4, 6);
	printf("arr4:%s\n", arr4);
	printf("----------------------------------------\n");

        代码讲解:这是一段arr4数组自己追加自己的代码 ,结果为:arr4:abcdefabcdef,在上一篇中并没有对strcat函数采用这段代码,是因为strcat不可实现自追加功能,会造成死循环,使系统崩溃掉,而strncat可以采用。

注:strncat也要保证目的地的数组空间要足够大


         3.strncmp函数

        strncmp函数是用来比较两字符串相应位置上ASCII码值大小的函数。

判断标准规定:

  •         第一个字符串大于第二个字符串,则返回大于0的数字
  •         第一个字符串等于第二个字符串,则返回0
  •         第一个字符串小于第二个字符串,则返回小于0的数字

         size_t count可以控制函数比较的此数,我会通过代码来讲解count的作用。

int main() {
	char a1[] = "abcdef";
	char a2[] = "abcdo";
	int ret=strncmp(a1, a2,4);

	if (ret > 0)
		printf(">\n");
	else if (ret == 0)
		printf("==\n");
	else
		printf("<\n");

         解析:我创建了两个字符串数组a1,a2,采用了strncmp函数进行两数组的比较,而且设置了比较的次数为4。a1的a与a2的a比较,结果相同,进行下一对的比较。比较了4次后达到了strncmp函数的要求,不再进行比较,基于对前面的比较结果最终判定a1与a2两个字符串相等,返回0。

        这就是strncmp函数的优点,虽然两字符串本质上并不相等,但设置了次数,就可以打破本质,改变规矩,达到我们想要的结果!!!

        以上就是我对受限制字符串函数strncpy,strncat,strncmp函数的介绍,觉得有用的话点个一键三连吧!下期见!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
生成圆周率的常用算法有很多,其中较为简单的是莱布尼茨公式(Leibniz formula): π / 4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + …… 根据该公式,我们可以不断累加前面的项来逼近圆周率。具体实现如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_DIGITS 1000000 // 圆周率的最大位数 int main() { int i, j, k; int sign = 1; // 符号位 int digit = 0; // 当前计算到的圆周率位数 char pi[MAX_DIGITS + 1] = "3.14"; // 初始化为 3.14 char tmp[MAX_DIGITS + 1]; // 临时存放当前项的结果 // 计算圆周率 for (i = 3; digit < MAX_DIGITS; i += 2) { sprintf(tmp, "%.2f", 4.0 / i * sign); // 计算当前项并转换为字符串 sign = -sign; // 更新符号位 for (j = 0; tmp[j] != '.'; j++) // 将当前项的整数部分加入 pi 中 { if (digit < MAX_DIGITS) { pi[digit++] = tmp[j]; } } if (digit < MAX_DIGITS) { pi[digit++] = tmp[j++]; // 将小数点加入 pi 中 for (k = 0; k < 2 && tmp[j + k] != '\0'; k++) // 将当前项的小数部分加入 pi 中 { pi[digit++] = tmp[j + k]; } } } pi[digit] = '\0'; // 将 pi 结尾 printf("圆周率的前 %d 位为:\n", MAX_DIGITS); printf("%s\n", pi); return 0; } ``` 在程序中,我们使用 sprintf 函数将计算出的当前项转换为字符串,然后将其整数部分加入 pi 中,最后加入小数点和小数部分。由于圆周率的位数可能非常大,我们需要使用一个字符数组来存储。在本程序中,我们假设圆周率的位数不超过 100 万位。 需要注意的是,由于计算机的浮点数精度限制,使用莱布尼茨公式计算圆周率的位数可能会受到一定的影响。如果需要计算更高精度的圆周率,可以使用其他算法,如马青公式(Machin formula)、高精度计算等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙予清的zzz~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值