C++ 程序员不知道以空字符结尾的字符串是如何工作的可以接受吗? [关闭]

Posted

技术标签:

【中文标题】C++ 程序员不知道以空字符结尾的字符串是如何工作的可以接受吗? [关闭]【英文标题】:Is it acceptable for a C++ programmer to not know how null-terminated strings work? [closed] 【发布时间】:2009-03-18 07:30:45 【问题描述】:

对于拥有 1.5 年经验的 C++ 程序员来说,有什么办法不知道空终止字符串作为一个概念存在并广泛用于各种应用程序中?这是否表明他可能是个糟糕的员工?

【问题讨论】:

当然,它们确实是 NUL 终止的字符串... 仅当您使用 ASCII 时 空终止(小写空)是在 C 和 C++ 标准中使用的准确术语。由于与空指针常量混淆,在这种情况下使用大写的 NULL 会产生误导。 这让我想起了 Joel 的帖子 Back to Basics 中的画家什莱米尔 糟糕 - 我在标准中找到了“null-terminated”这个短语,尽管 Adob​​e Acrobat 无法通过搜索找到它。我很抱歉。 【参考方案1】:

C++ 程序员有什么办法吗 拥有 1.5 年的经验 不知道以 NULL 结尾的字符串 作为一个概念存在并被广泛使用 在各种应用中?

没有。这 1.5 年他/她在做什么?

这是否表明他有可能 糟糕的招聘?

是的。 C++ 程序员必须具备 C 知识。

【讨论】:

“应该是强制性的” - 不!你可以在不了解 C 的情况下学习 C++(事实上有些人认为这更好,因为你没有学习 C 的所有坏习惯)。 @Pax 你的意思是,学习 C++ 的糖果面向对象部分,但完全跳过有关内存管理、指针算法、reinterpret_casts 的核心部分? @Pax:我认为您混淆了两个不同的想法:(1)在 C++ 中尽可能避免使用原始 C 字符串,因为 std::string 更安全、更方便; (2) 了解常见的“坏”技术,因为您在维护现有代码时经常需要处理它们。 @Pax:不知道 C 的坏习惯(以及它们不好的事实)意味着你可能会在 C++ 中犯同样的错误。 @sharptooth,这些都是 C++ 的一部分(实际内存 mngmn (new/delete) 和 reint_cast 在 C 中甚至不存在)。指针与 C 一样是 C++ 的一部分。所以我的意思是学习所有这些。如果您有 std::string,则无需学习 null-term 字符串。【参考方案2】:

他用什么——只有std::string?他知道字符串文字吗?他对字符串文字有什么看法?

没有太多细节可以告诉你他是不是一个糟糕的员工,但他听起来比大多数人都需要更多的交谈。

【讨论】:

只有 std::string 有什么问题?也许他只使用字符串文字来构造 std::strings。我每天都使用 Java 的集合,但我并不关心它们是如何在幕后实现的。我不在乎一种语言是否使用 C-null 或 Pascal 长度的字符串,只要它们有效。 没什么问题,Pax。但它是不寻常的。或者至少有点令人惊讶,不是吗? 1.5 年,如果他们甚至听说过 C++,我会感到惊讶,更不用说 C。Unis 现在不是在推动 Java/Perl/Python/C# 吗? 我只是想对可怜的小伙子公平一点。这就是为什么我问了这么多问题。我想你只能了解更多。 @n0rd:虽然 c_str() 是使用以 null 结尾的 C 字符串实现 std::string 的一个很好的理由,但这并不意味着它总是以这种方式工作。依赖这样的实现细节是不好的做法,因为它们可能会在没有通知的情况下更改。【参考方案3】:

这是否表明他可能是一个糟糕的员工?

毫无疑问,C++ 程序员必须了解所有很棒的 STL 东西背后发生了什么。

不幸的是,市场上有太多不合标准的 C++ 程序员。

顺便说一句:不是以 NULL 结尾,而是以零结尾。

【讨论】:

它们以 null 结尾,ASCII 字符 #0 为 NUL,即 null 字符(参见 asciitable.com)。我很确定大多数文本都将它们称为空终止。 std::string 不是空/零终止,如果它们比找到它们的大小将具有 O(n) 复杂度 csiz:可以将 std::string 实现为空终止(内部)并且仍然具有 time-O(1) 大小。但是,我读这个答案是为了澄清术语,甚至根本不谈论 std::string 。 (并且“空终止”或不带连字符是正确的。)【参考方案4】:

恕我直言,我希望一个称职的程序员有基本的好奇心,想知道像 STL 容器这样的东西实际上是如何工作的。请注意,我不希望他们一定准备好实施一个。

但是以 NUL 结尾的字符串是 C 和 C++ 的基本数据类型。有机会避免使用容器的杂乱细节是一种奢侈。您仍然必须感谢容器为您所做的一切。

【讨论】:

【参考方案5】:

我会说这取决于您想雇用他们的目的,以及他们在您的组织中的目的。

懂 C++ 但不懂 C(现在很容易做到)的人将属于这种类型。他们有可能成为一名优秀的员工。但是,我会说这是一个警告,所以根据他们的简历,这将是我书中对他们的一个标记。

但是,如果他们将从事相当简单的项目,并且不需要设计和开发代码库的关键部分(至少在早期),他们可能会很好。

但是,我不会聘请不了解此类基本概念的人进行设计或从事关键系统的工作。我雇用的任何将从事 C++ 项目的高级开发人员都需要了解内存管理、C 和 C++ 的基本概念、模板和泛型编程,以及他们所使用的语言的所有基础知识,至少在合理的程度上。将使用。

不理解字符串文字如何工作的概念将是一个很大的缺点 - 即使他们将使用 std::string 或类似的东西,我希望他们至少在某种程度上理解它是如何工作的,而且其他选项。理解这些概念有助于理解更新、更好的技术背后的基本原理,也有助于理解使用它们时所做的妥协。它还有助于了解在那里做出的设计决策,并将它们应用到您自己的项目中。

【讨论】:

【参考方案6】:

在我们公司所做的工作中,我想许多其他地方也是如此,您必须了解以 NULL 结尾(或以零结尾)的字符串。是的,我们使用 C++,并且我们尽可能使用 std::string。但是我们有几年前开发的代码,它使用 C 风格的字符串、sprintf 和这类东西。那么你有外部代码和API,你怎么能在不知道这些C概念的情况下调用Windows API呢?

那么他会是一个糟糕的雇员吗?好吧,你不知道的东西你可以学到……但这绝对不是一个好兆头。

【讨论】:

【参考方案7】:

以 NUL 结尾的字符串(又名 ASCIIZ)甚至不是 C 构造,我认为一个好的程序员至少应该知道有不同的方式来存储字符串(以 0 结尾,以长度为前缀...)。

也许你永远不需要这个,但对我来说,感觉就像在不打开电脑的情况下使用你的电脑,看看里面有什么只是为了更好地理解它。

我不会说不了解它的人可能是一个糟糕的雇用,但请注意,如果您在项目中使用以 NUL 结尾的字符串,他将不得不学习这个概念并且可能会偶然发现该字段中的常见错误(不将数组大小增加 1 以存储额外的 0 等),了解 NUL 终止字符串的程序员不会。

【讨论】:

在字符串文字创建它们的意义上,它们是 C 构造,标准 C 运行时库假定它们。该标准不假定使用 ASCII,但假定 char 值为零会终止字符串。在 ASCII 中,该代码点被命名为 NUL。 是的,你是对的,如果你想学习 C,这个概念是必需的。我只是想把重点从 C/C++ 转移到其他编程语言 - 例如,如果你也可能会遇到问题你不知道这个概念并使用Delphi。 我完全同意这个概念超越了 C 语言,甚至出现在奇怪的地方(例如,连接 C 和 Python,因为 Python 字符串可能嵌入了空值......) 我不明白为什么每个人都说他们是“c 构造”。它们是相同的“c++ 构造”。所以确实必须学习它们:)【参考方案8】:

不知道它们的存在 - 一个非常糟糕的信号 几乎不使用它们 - IMO 并不是一个坏兆头。早在我编写 C++ 编程的时候,我就避免使用 null 终止的字符串,除了字符串文字。

使用了std::strings(或CStrings)。

【讨论】:

【参考方案9】:

这意味着他们从未打开过输入或输出的文件。标准库无法通过 std::string 指定文件名 - 您必须使用以零结尾的文件名。

【讨论】:

STL 包括 istream 和 ostream,用于通过 >> 和 你也可以在代码中有一个字符串字面量,在这种情况下,字符串的底层实现就没什么意义了 @michael 请阅读我写的 - open() 成员函数需要一个 C 字符串作为它的第一个参数 @drhazzard - 使用固定文件名的代码有点不寻常 - 或者您是否只编辑过具有单个固定名称的单个文件?【参考方案10】:

听起来这是一个没有程序员出身的程序员。我在大学里上过 C++ 课,甚至读过几本关于这门语言的书。前 3 章中的每本书都将解释一个字符串(一个字符数组)如何通过使用“/0”标识符来知道它的结尾。这是C++的基础知识。

这个程序员听起来像是一个商业用户,他想通过学习“编程”来降低成本,以便在没有受过良好教育和经验丰富的开发人员的情况下为公司创建软件。

对不起,如果这听起来很刺耳。我非常认真地对待我的职业,并认为它是一种艺术形式。

【讨论】:

【参考方案11】:

考虑任何基于 C/C++ 的本科课程作业。他/她必须参加一门数据结构课程,并且这门课程必须有一个作业,他们必须从头开始实现字符串类型。显然,没有人期望 std::string 的所有功能,但他们一定已经实现了一个字符串类,并且当他们这样做时,他们一定已经深入探讨了这个问题。

没有雇佣。

【讨论】:

目前大多数本科生课程都是Java,其中String实际上是一种原始类型,所以不,他们可能不会实现字符串类。不过,并不是说他们不应该在其他课程中学习它。 也许我过于笼统了,但当我还是本科生时就是这样。这就是我在 MS 期间担任 TA 时的情况。这就是(最近)当我在读博士时填补教练职位的情况。学生。 8 年跨 3 所大学。我的采样可能有限。【参考方案12】:

人们在接受采访时会说和做各种奇怪的事情。你见过这个人写代码吗?

1.5 年不是很多时间,但如果员工不能正确思考,经验就意味着蹲下。因此,我将其记录为警告标志并深入挖掘。如果面试阶段结束了,你必须做出决定,这听起来像是your answer should be NO HIRE。

【讨论】:

【参考方案13】:

我会说这取决于你在寻找什么。如果您正在寻找一个相对缺乏经验(因此可能很便宜)的程序员,您可以塑造以适应您的组织,那么他可能没问题。您刚刚发现他不知道 C 是如何做事的,而且当它们出现时,您必须向他解释一大堆 C 概念。

在这一点上,重要的是要弄清楚他是没有受过教育(他以前从未遇到过这种需要),还是他是那种从不学习任何他不需要的东西的人,或者他是个白痴。如果#1,那么您可以考虑雇用他,如果他知道足够有用的话。如果#2,那么我会通过,但也许您可以使用 9-5er。如果 #3,给他开门。

而且我不会太认真地不知道 C 的东西,我遇到过用 C 编程 15 年的人,他们不知道 __FILE____LINE__。他们很好,只是在我给他们看之前他们从来没有遇到过。这家伙可能也是这样——他只见过 STL 的做事方式,所以他什么都不知道。

【讨论】:

【参考方案14】:

在您的招聘决定中,您应该考虑他是否能够了解重要信息,而不是他现在是否知道这些信息。就商业经验而言,一年半几乎没有任何时间。正如其他人所提到的,深入挖掘,尝试找到他的编程知识的边界,并尝试弄清楚将这些边界向外推会有多难。这在很大程度上取决于个人习惯和性格。如果他是一个很好的学习者和一个很好的沟通者,他就是一个很好的雇员。如果技术学习超出了他的能力范围,那么编程对他来说可能不是最好的职业。

【讨论】:

【参考方案15】:

嗯,我从德国 SAP 的一位朋友那里听说,他们聘请了某人作为开发人员,后来发现他一直认为 1KB = 1000 字节。看起来他们是在他制造某种错误时发现的。他们很震惊,然后让他去做客户支持。

相比之下,您新聘用的开发人员可能是个天才。如果说真的,他本可以在高级语言占据大部分市场并且没有跳过低级编程(C++ 或其他东西)的时代开始积累经验。

并不一定意味着他不好。只属于新一代百事可乐开发者。

【讨论】:

冒着被锤击的风险 - 不是 1KB = 1 KB = 1000 字节吗? 他们本可以派他去硬盘行业工作的。【参考方案16】:

不存在以 NULL 结尾的字符串,所以我猜他可能是个不错的雇员。

更新:根据一些 cmets,null-terminatedterminating '\0' 出现在 C++ 标准中。我没有删除我的答案,而是将其转为 wiki,以保留辩论中有趣的部分。

【讨论】:

字符串当然是 N​​UL 终止的 ;-) 开个玩笑。实际上它们是零终止的(因此在修改后的匈牙利符号中使用“z”前缀),而 NULL 是指向没有有效对象的指针的名称 - 它没有实际要求具有值 0 说 NUL 终止也是不正确的以 ASCII 为中心的术语。说它们是“空终止”(小写空)是正确的,并且在 C 和 C++ 标准中都使用了术语。 如果我看到 class C private: char * someting;我没有看到“以 NULL 结尾的字符串”,我只看到了一个指向 char 的指针。你用这个指针做什么 - 你必须彻底记录它。我不能通过阅读代码来假设任何事情。 @Daniel:您最后的评论当然是正确的,但我看不出它与问题、您的帖子或前面的讨论有什么关系。

以上是关于C++ 程序员不知道以空字符结尾的字符串是如何工作的可以接受吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式匹配不以某些字符开头或结尾的单词?

C++学习(三六四)notepad如何查看行结尾的字符

wchar 以单个或两个空字节结尾?

一个 C++ 函数,用于测试 C 字符串是不是以后缀结尾

正则表达式:不匹配以换行符 (\n) 结尾的字符串和行尾锚 ($)

字符串的正则表达式不以给定的后缀结尾