问题标签 [null-terminated]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2259 浏览

c - 如果我将非空终止缓冲区作为第一个参数传递给 strstr,会发生什么情况?

据我了解,该函数char *strstr(const char *s1, const char *s2);在以空字符结尾的字符串 s1 中搜索以空字符结尾的字符串 s2。

假设我传递了一个以空结尾的字符串 s2,但是作为 s1 传递的缓冲区不是以空结尾的,如果字符串 s2 不存在于 s1 中会发生什么情况?函数 strstr 将从 s1 的起始地址开始继续搜索 s2,直到找到一些 '\0'。但是,假设它根本找不到'\0'?它会访问一些受保护或禁止的内存区域并崩溃吗?

我知道这是一种未定义的行为,但根据您的经验,可能是什么问题?

0 投票
2 回答
255 浏览

c++ - 有没有办法定义“备用”字符串终止符(除了空终止符,\0)

我不一定想这样做,但我很好奇。在 C/C++ 中,除了 null 终止符之外,还有其他方法可以定义字符串终止符吗?例如,是否可以这样写,

并获得输出,

?

如果不可能,那么有没有办法获得指向缓冲区部分的指针,而无需分配/复制内存,也无需修改缓冲区,即将s覆盖|\0s?

0 投票
3 回答
2959 浏览

c++ - 基于空终止字符串的for循环范围

我有点假设基于范围的 for 循环将支持 C 风格的字符串

然而事实并非如此,该标准[stmt.ranged] (6.5.4)表示基于范围的适用于以下三种可能性之一:

  1. 范围是一个数组
  2. 范围是具有可调用beginend方法的类
  3. 在关联的命名空间(加上std命名空间)中有可访问的 ADL

当我在全局命名空间中添加beginend函数时,const char*我仍然会收到错误(来自 VS12 和 GCC 4.7)。

有没有办法让基于范围的 for 循环与 C 风格的字符串一起工作?

我尝试添加重载namespace std并且这有效,但据我了解,添加重载是非法的namespace std(这是正确的吗?)

0 投票
1 回答
2988 浏览

delphi - PChar('') 是否保证是指向 #0 的指针(不是 nil)?

我知道在 Delphi 中,一个空字符串(AnsiString 或 WideString)可以用一个 nil 指针表示,也可以用一个指向实际空字符串的指针表示。

通过实验,我已经在 Delphi XE2(具有特定的编译器设置)中证明了这一点PChar('') <> nil。但这是否得到保证,或者它可能会在未来的版本中发生变化,或者取决于某些编译器设置?

我正面临信任危机。如果有人能给我一个明确的答案,我将不胜感激。

0 投票
2 回答
145 浏览

c - fprintf 字符串终止的心理障碍

我对这个完全不知所措。我不知道为什么这不起作用。带有 NULL 终止符的简单字符数组 - 除了当我输出它时,它不会终止!

这是我的输出:

我无法弄清楚为什么这不能正确终止。我试过让数组更长,但每次都得到相同的结果。我快疯了!

有人看到吗?谢谢。

0 投票
1 回答
294 浏览

c - 创建一个以 null 结尾的字符串数组,其中大多数字符串数组是静态的

我正在尝试创建一个以 null 结尾的字符串数组。数组中的所有内容在编译时都是已知的,除了在运行时放入其中的一个元素。

这就是我希望数组的外观: [ ["command1", "arg", "arg", 0], ["command2", 0], argv, ["command3", "arg", 0] ]

所以这里的 command1、command2 和它们的 args 在编译时是已知的,只有 argv 在运行时被放入其中。

问题是我无法完成这项工作。目前我这样做是为了创建一个带有 NUM_COMMANDS(数字)命令的数组:

但它不允许我插入 argv。

我怎样才能把它变成我想要的那种数组?

谢谢!

0 投票
2 回答
3626 浏览

c - 为什么“%s”格式说明符即使对于没有 `\0` 的字符数组也有效并且一次打印其所有元素?

看下面的代码:

它输出整个name ERIC。为什么会这样?只有当我们如下%s初始化字符数组时才应该起作用:name

我没有考虑以下内容,因为这显然假设了一个以空字符结尾的字符数组:

0 投票
5 回答
7199 浏览

c - 如何连接两个 C 风格(以空结尾)字符串?

我想连接两个定义如下的字符串:

我知道我应该跑过第一个,找到'\0'标志,而不是开始第二个字符串。功能是否strcat以相同的方式工作?

我正在使用的代码:

编译后出现这样的错误:

* 检测到堆栈粉碎 * : ./run 终止

我究竟做错了什么?

0 投票
2 回答
500 浏览

c - C 字符串在内存中的表示和比较

我有这样的代码:

有些部分我不清楚。我知道内存中以空字符结尾的字符串是字节,所有位都等于 0(ASCII)。这就是为什么当*p != 0我们决定找到字符串的结尾时。如果我想搜索到零字符,我应该与 48 进行比较,它是DEC根据 ASCII 在内存中的 0 表示。

但是为什么在访问内存时我们使用HEX数字,而为了比较我们使用DEC数字呢?

是否可以比较"\0"为字符串的结尾?像这样的东西(不工作):

据我了解"\48"等于0

0 投票
5 回答
2599 浏览

c++ - 为什么 strrchr() 返回 `char*` 而不是 `const char*`?

该函数在( ) 中char* strrchr(const char *str, int ch)返回一个指针 ( ),其中最后一次出现。char*strconst char *ch

因此,我们可以编写以下代码而无需任何强制转换:

char*return而不是return 有什么好处const char*

编辑:
正如Shafik Yaghmour指出的那样, strchr implementation 如何工作有很好的答案?

由于我的代码是 C++,所以我将<cstring>使用<string.h>. 感谢您的回答;-)

然而,迈克西摩的回答最适合这个问题。我什至在下面添加了一个更详细的答案,以清楚地说明strrchr()C 函数(不允许重载),声明同时适合const非 const字符串。因为strrchr()可以用非常量字符串调用,所以返回的字符串也应该是非常量的