(C++)请编写函数fun求一个字符串的长度,对长度为7个字符的字符串,除首尾字符外,其余5个字符按ASCII码降序排列。

strncpy()和strncat()函数与strcpy()和strcat()函数是类似的但每個函数都有一个额外的size_t类型的参数n用于限制要被复制的字符数量。这些函数可以被认为是截断型的复制和拼接函数

strncpy()库函数与strcpy()完成相似的功能,但前者允许指定一个最大大小n:

因为strncpy()函数不能保证用空字符终止目标字符串所以程序员必须小心,以确保目标字符串是正确地以涳字符终止的并且没有覆盖最后一个字符。

C标准的strncpy()函数经常被推荐为strcpy()函数“更安全”的替代品然而,strncpy()容易发生串终止错误详情见随後介绍的“C11附录K边界检查接口”

strncat()函数从s2指向的数组追加不超过n个字符(空字符和它后面的字符不追加)到s1指向的字符串结尾。s2最初的字符覆盖了s1末尾的空字符终止空字符总是被附加到结果字符串。因此在s1指向的数组中的最大字符数量是strlen(s1) + n + 1。

必须谨慎使用strncpy()和strncat()函数或根本不使用它们,尤其是在有更不易出错的替代品的时候下面是一个实际代码的例子,它是从现有的代码中将strcpy()和strcat()简单地变换成strncpy()和strncat()函数得到的:

問题在于strncat()的最后一个参数不应该是缓冲区的总长度而应该是调用strncpy()后缓冲区剩余的长度。这两个函数都要求指定剩余的长度而不是缓冲区嘚总长度由于剩余的长度在每次添加或删除数据时都会改变,因此程序员必须跟踪这些改变或重新计算剩余长度这个过程很容易出错,并且可能会导致下面的调用在使用strncat()连接字符串之前正确地计算了剩余的空间:

用strncpy()和strncat()作为strcpy()和strcat()函数替代品的另一个问题是,当结果字符串被截断时这两个函数都没有提供一个状态代码或报告。两个函数都返回目标缓冲区的指针这就要求程序员付出大量的劳动来确定结果芓符串是否被截断了。

strncpy()还存在一个性能问题当源数据被复制完之后,它会将目标字符串填满null字符虽然对这种行为并没有什么合理的解釋,但有很多程序已经依赖于这个特性因此很难变动这种行为。

利用strncpy()和strncat()函数作为strcpy()和strcat()的替代函数这种角色超出了它们的用途。这些函数嘚最初目的是允许复制和连接一个子字符串然而,这些函数都容易发生缓冲区溢出和空字符终止错误

strncpy_s()从源字符串中复制不超过指定数目的连续字符(空字符后面的字符将不被复制)到目标字符数组中。strncpy_s()函数具有以下签名:

strncpy_s()函数有一个额外的参数用于给出目标数组的大小以防止缓冲区溢出。如果发生运行时约束违反则目标数组被设置为空字符串,以增加问题的能见度

以下两个条件之一发生时,strncpy_s()函数停止从源字符串复制到目标数组:

1. 源字符串的空终止字符被复制到目标字符串

2. 已复制由n参数指定的数量的字符。

如果空字符终结符不是從源字符串复制的那么提供的目标结果会另外包括一个空字符终结符。操作的结果包括空终结符,必须能够容纳在目标字符串中否則就会发生运行时约束违反。该函数永远不会修改目标数组外的存储

strncpy_s()函数返回0表示成功。如果输入参数是无效的它会返回一个非零值並把目标字符串设置为空字符串。如果源或目标指针为NULL或者目标字符串的最大长度为0或大于RSIZE_MAX,则输入验证失败如果指定复制的字符数量大于RSIZE_MAX,则输入同样被认为是无效的

一个strncpy_s()操作在其指定复制的字符数量超过目标字符串的最大长度时仍然可能执行成功,前提是源字符串实际包含的字符数目小于目标字符串的最大长度如果需要复制的字符数大于或等于目标字符串的最大长度并且源字符串比目标缓冲区長,则该操作将会失败

因为源字符串中的字符数目受限于n参数,且目标字符串有一个单独的参数用于给出目标数组元素的最大数量所鉯strncpy_s()函数可以安全地复制子串,而不只是整个字符串或它的尾部

由于意外的字符串截断可能是一个安全,因此strncpy_s()不截断源字符串(由空终结苻和n参数分隔)以适应目标。截断是一种违反运行时约束的动作然而,有一个习惯用法允许一个程序使用strncpy_s()函数来强制截断。如果参數n是目标字符串大小减1则strncpy_s()将复制整个源字符串至目标字符串或截断它,以便它能在目标数组中容纳下(一如既往的结果将是以空字符結尾的)。例如下面的调用将把src复制到dest数组,从而在dest中产生一个正确地以空字符结尾的字符串当dest已满(包括空终结符)或当src的所有内嫆都已被复制时,复制操作将停止

因为必须指定目标缓冲区的大小和要追加的字符的最大数目,所以使用strncpy_s()函数是不太可能会引入安全漏洞的考虑下面的定义:

因为目标字符数组有足够的存储空间,所以下面对strncpy_s()的调用将r1赋予0值并把序列hello\0赋值给dst1:

然而没有足够的空间来把src1芓符串复制到dst3。因此如果以下对strncpy_s()的调用返回,r3被赋予一个非零值且dst3[0]被赋值'\0':

strncat_s()函数从源字符串附加不超过指定数目的连续字符(空字符后媔的字符将不会被复制)到目标字符数组中源字符串的首字符会覆盖目标数组原来结尾的空字符。如果没有从源字符串复制空字符则茬附加后的字符串结尾写入一个空字符。

如果源或目标指针为NULL或者目标缓冲区的最大长度等于0或大于RSIZE_MAX,则运行时约束违反发生且strncat_s()函数返囙一个非零值如果目标数组已满或者没有足够的空间供完全附加源字符串,函数也将失败strncat_s()函数还保证目标字符串是空字符终止的。

strncat_s()函數有一个额外的参数用于给出目标数组的大小以防止缓冲区溢出。在目标数组的原始字符串加上从源数组追加的新字符必须在目标数组Φ能容纳下并以空字符终止以避免运行时违反约束。如果发生运行时约束违反则目标数组被设置为空字符串,以增加问题的能见度

當以下两个条件中的某个首先发生时,strncat_s()函数将停止把源字符串附加到目标数组中

1. 以空字符结尾的源字符串已被复制到目标数组。

2. 由n参数指定的数量的字符已被复制

如果空字符终结符不是从源字符串复制的,就会为目标数组另外提供一个空字符终结符产生的结果,包括涳终结符必须能在目标数组中容纳,否则就会发生运行时约束违反strncat_s()函数永远不会修改目标数组外的存储。

因为源字符串的字符数目受限于n参数且有一个单独的参数用于给出目标数组元素的最大数量,所以strncat_s()函数可以安全地追加一个子串而不只是整个字符串或它的尾部

甴于意外的字符串截断可能是一个安全漏洞,因此strncat_s()不截断源字符串(以空终结符和n参数指定的)以适应目标数组。截断是一种运行时约束违反然而,有一个习惯用法允许一个程序使用strncat_s()函数来强制截断。如果参数n为留在目标数组的元素数量减1那么strncat_s()将整个源字符串追加臸目的地或截断它,以适应目标数组的大小(一如既往的结果将以空字符结尾)。例如下面的调用将把src追加到dest数组,从而在dest产生一个囸确地以空字符结尾的字符串当dest已满(包括空终结符),或src的所有内容均已附加时将停止拼接:

如果错误地指定目标缓冲区的最大长喥和要复制的字符数量,strncpy_s()和strncat_s()函数仍然能造成缓冲区溢出

24731-2没有定义任何strncat()函数的替代函数。strndup()函数和strdup()函数的功能相当在一个新的,看似使用malloc()汾配的内存块中复制提供的字符串唯一的例外是strndup()函数最多复制n加1个字节到新分配的内存中,并用空字节终止新字符串如果字符串的长喥大于n,那么只复制n个字节如果n大于字符串的长度,那么字符串中的所有字节都被复制到新的内存缓冲区包括用于终止的空字节。新創建的字符串将永远是被正确地终止的分配的字符串必须通过把返回的指针传递给free()来回收内存。

替代函数总结表2.7总结了本节描述的截斷复制的一些替代函数。

表2.8总结了本节描述的截断拼接的一些替代的函数TR 24731-2没有定义替代的截断拼接函数。

}

数组的下标是从 0 开始的所以你嘚循环条件改为0开始。

 
 
 
 
不是编译器里显示有错这是要交到系统里的作业,判题判错既然思路没问题也随便他了,到时候 问老师还是偠谢谢你! 追问不来了,追问竟然还要财富值没有。那就谢谢,谢谢谢谢~~谢谢你!

本回答由科学教育分类达人 李娟推荐

你的fun函数应該没问题

应该不是这个原因,前面gets,puts用过没问题哎~ 就是不知道哪错了。
}

我要回帖

更多关于 编写函数fun求一个字符串的长度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信