C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了什么类型的字符串是C字符串函数的合法输入?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
像strcat和strcmp这样的函数是否需要以null结尾的字符串作为参数,或者是否可以接受任何字符数组?

所有文档都表明它必须以空值终止,但是最着名的在线引用之一(http://cplusplus.com)给出了以下作为strcmp的示例:

/* strcmp example */
#include <stdio.h>
#include <String.h>

int main ()
{
  char szKeY[] = "apple";
  char szInput[80];
  do {
     printf ("Guess my favourite fruit? ");
     gets (szInput);
  } while (strcmp (szKey,szInput) != 0);
  puts ("Correct answer!");
  return 0;
}

解决方法

是的,这些函数需要以null结尾的字符串.但是,您上面列出的示例确实使用以null结尾的字符串.例如,该行

char szKeY[] = "apple";

描述一个附加了空终止符的字符串,即使它在代码中没有立即显现. C中的任何字符串文字都会自动以空值终止,即使您没有明确地将请求放在自己中(尽管有一个例外,我们将在一分钟内看到).

而且,在线

gets (szInput);

函数自动将空终止符附加到它从控制台读取的字符串的末尾.事实上,除了少数例外(例如众所周知的复杂的strncat函数),< String.h>中的所有字符串操作函数都是如此.自动附加一个空终止符.除非您自己明确地弄乱字符字节,否则在常见用法中很少使用非空终止字符串.

也就是说,有很多方法可以获得非空终止的字符串.例如,如果您定义这样的字符串:

char Hello[5] = {'h','e','l','o'}; /* Careful! */

此数组不会以空值终止,因为您已明确列出了您希望它具有的值.这意味着你拥有的是一个字符数组而不是字符串.如果你然后试着打电话

printf("%s\n",Hello);

您将遇到未定义的行为,因为该数组不是以null结尾的.

此外,如果您使用任何原始内存操作例程,如memcpy或memmove,那么您需要小心确保复制或显式设置null终止符,因为这些例程没有null终止符的概念.

另外,一个快速的术语 – NULL通常是指空指针,即明确标记为指向无对象的指针. null-terminator中的null引用具有数值0的字符,并且是用于指示已到达字符串结尾的字符(不是指针).名称相同(并且有相似之处),但最好不要混淆两者.

希望这可以帮助!

大佬总结

以上是大佬教程为你收集整理的什么类型的字符串是C字符串函数的合法输入?全部内容,希望文章能够帮你解决什么类型的字符串是C字符串函数的合法输入?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。