为什么std :: string :: substr抛出异常而不是返回空字符串?

格拉斯

一段时间以来,我一直想知道std::stringsubstr(pos, len)方法设计背后的原理这对我来说仍然没有意义,所以我决定请教专家。std::out_of_range如果pos参数超过字符串长度加一,该函数将引发异常有时这可能会带来不便(甚至烦人),但我真正关心的是一致性和最少惊讶的原则。事实证明,pos+len子字符串的“结束”位置可以超过字符串长度加一。我从一开始就不允许这样做,但到最后都不允许这样做。最后允许我暗示了这种解释

返回位置上的所有字符 pos <= i < pos+len

但是,我希望该函数返回一个空字符串,以获取pos超出字符串长度的,而不是引发异常。附带说明一下,使用这种解释,甚至允许使用负值pos(假设它具有带符号的类型)甚至是明智的

这给我留下了以下问题:

  • 这种设计对您来说合乎逻辑吗?懂吗 您是否有令人满意的方法来解决不一致问题?我能提出的唯一可能的解释是与以null终止的字符串兼容。使用null终止时,指定的长度是否超过末尾都没有关系,而从null字符开始则是内存错误。但是,std::string不是以Null结尾的,而是跟踪字符串的长度。如果这是真正的原因,那么我个人认为那是一个非常糟糕的原因。
  • 在性能方面有优势吗?我实际上会感到惊讶。
  • 我在可用性方面是否忽视了优势?可能是标准习语或用例与其他功能结合使用,例如find?同样在这里,我的印象是返回一个空字符串有可能简化某些代码。
  • 有什么办法可以改变substr未来的行为我猜不是,因为静默地破坏现有代码肯定比忍受这种扭曲……还糟。
特尔温

这个问题的确是基于观点的,但是我将尝试一点一点地回答它。

  • 这种设计对您来说合乎逻辑吗?懂吗 在我看来,这是合乎逻辑的。也许这样的意见来自于strncmp样式化的函数,但是通过这样的设计,您只需为len参数传递缓冲区长度,它就可以正常工作。但是,如果您尝试访问位于字符串边界之外的子字符串,那么您可能会错过一些简单的健全性检查。和的内部实现std::string无关紧要。
  • 在性能方面有优势吗?我认为那不是原因。
  • 我在可用性方面是否忽视了优势?也许,请看第1点。
  • 将来有什么方法可以改变substr的行为?标准中定义了pos超出的抛出异常size(),因此很可能没有。

我的观点是:此异常(尽管我不愿使用这些异常)使您可以注意到缺少一些基本完整性检查的代码,例如访问缓冲区边界之外的代码。相似at()的功能和许多其他功能都使用了相同的设计

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么String.match(/ \ d * /)返回空字符串?

来自分类Dev

为什么python输入函数返回空字符串而不是等待用户输入?

来自分类Dev

为什么char * foo()返回空字符串?

来自分类Dev

为什么 glGetProgramInfoLog 返回空字符串?

来自分类Dev

为什么std :: string不是std :: vector的特化?

来自分类Dev

为什么我需要写“ std :: string”而不是“ std :: getline()”?

来自分类Dev

为什么“自动”将字符串声明为const char *而不是std :: string?

来自分类Dev

为什么“自动”将字符串声明为const char *而不是std :: string?

来自分类Dev

为什么在返回字符串的函数上调用std :: string.c_str()无效?

来自分类Dev

Java String.valueOf返回空字符串

来自分类Dev

为什么返回vector <string>会抛出std :: bad_alloc异常?

来自分类Dev

为什么std :: string的const访问器返回引用?

来自分类Dev

为什么在C ++ std :: string中将Unicode字符视为相同?

来自分类Dev

为什么使用std :: string和std :: string&类似的函数初始化字符串?

来自分类Dev

当有更多字符可用时,为什么takeWhile返回空字符串?

来自分类Dev

为什么我的python代码返回text:'my string'而不是我的字符串?

来自分类Dev

为什么java.util.Scanner.next()返回空字符串?

来自分类Dev

为什么process.MainWindowTitle返回空字符串?

来自分类Dev

为什么null语句ToString()返回空字符串?

来自分类Dev

为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

来自分类Dev

为什么null语句ToString()返回空字符串?

来自分类Dev

为什么我的函数在python中返回空字符串?

来自分类Dev

为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

来自分类Dev

为什么process.MainWindowTitle返回空字符串?

来自分类Dev

Bash:为什么不匹配时不返回空字符串

来自分类Dev

std :: io :: TcpStream :: read_as_string返回一个空字符串

来自分类Dev

std::string 的 c_str() 函数如何返回空终止字符串?

来自分类Dev

为什么std :: string str = {}?

来自分类Dev

为什么Java String.split()留在空字符串后面?

Related 相关文章

  1. 1

    为什么String.match(/ \ d * /)返回空字符串?

  2. 2

    为什么python输入函数返回空字符串而不是等待用户输入?

  3. 3

    为什么char * foo()返回空字符串?

  4. 4

    为什么 glGetProgramInfoLog 返回空字符串?

  5. 5

    为什么std :: string不是std :: vector的特化?

  6. 6

    为什么我需要写“ std :: string”而不是“ std :: getline()”?

  7. 7

    为什么“自动”将字符串声明为const char *而不是std :: string?

  8. 8

    为什么“自动”将字符串声明为const char *而不是std :: string?

  9. 9

    为什么在返回字符串的函数上调用std :: string.c_str()无效?

  10. 10

    Java String.valueOf返回空字符串

  11. 11

    为什么返回vector <string>会抛出std :: bad_alloc异常?

  12. 12

    为什么std :: string的const访问器返回引用?

  13. 13

    为什么在C ++ std :: string中将Unicode字符视为相同?

  14. 14

    为什么使用std :: string和std :: string&类似的函数初始化字符串?

  15. 15

    当有更多字符可用时,为什么takeWhile返回空字符串?

  16. 16

    为什么我的python代码返回text:'my string'而不是我的字符串?

  17. 17

    为什么java.util.Scanner.next()返回空字符串?

  18. 18

    为什么process.MainWindowTitle返回空字符串?

  19. 19

    为什么null语句ToString()返回空字符串?

  20. 20

    为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

  21. 21

    为什么null语句ToString()返回空字符串?

  22. 22

    为什么我的函数在python中返回空字符串?

  23. 23

    为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

  24. 24

    为什么process.MainWindowTitle返回空字符串?

  25. 25

    Bash:为什么不匹配时不返回空字符串

  26. 26

    std :: io :: TcpStream :: read_as_string返回一个空字符串

  27. 27

    std::string 的 c_str() 函数如何返回空终止字符串?

  28. 28

    为什么std :: string str = {}?

  29. 29

    为什么Java String.split()留在空字符串后面?

热门标签

归档