问题标签 [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.
c - 如果我将非空终止缓冲区作为第一个参数传递给 strstr,会发生什么情况?
据我了解,该函数char *strstr(const char *s1, const char *s2);
在以空字符结尾的字符串 s1 中搜索以空字符结尾的字符串 s2。
假设我传递了一个以空结尾的字符串 s2,但是作为 s1 传递的缓冲区不是以空结尾的,如果字符串 s2 不存在于 s1 中会发生什么情况?函数 strstr 将从 s1 的起始地址开始继续搜索 s2,直到找到一些 '\0'。但是,假设它根本找不到'\0'
?它会访问一些受保护或禁止的内存区域并崩溃吗?
我知道这是一种未定义的行为,但根据您的经验,可能是什么问题?
c++ - 有没有办法定义“备用”字符串终止符(除了空终止符,\0)
我不一定想这样做,但我很好奇。在 C/C++ 中,除了 null 终止符之外,还有其他方法可以定义字符串终止符吗?例如,是否可以这样写,
并获得输出,
?
如果不可能,那么有没有办法获得指向缓冲区部分的指针,而无需分配/复制内存,也无需修改缓冲区,即将s覆盖|
为\0
s?
c++ - 基于空终止字符串的for循环范围
我有点假设基于范围的 for 循环将支持 C 风格的字符串
然而事实并非如此,该标准[stmt.ranged] (6.5.4)
表示基于范围的适用于以下三种可能性之一:
- 范围是一个数组
- 范围是具有可调用
begin
和end
方法的类 - 在关联的命名空间(加上
std
命名空间)中有可访问的 ADL
当我在全局命名空间中添加begin
和end
函数时,const char*
我仍然会收到错误(来自 VS12 和 GCC 4.7)。
有没有办法让基于范围的 for 循环与 C 风格的字符串一起工作?
我尝试添加重载namespace std
并且这有效,但据我了解,添加重载是非法的namespace std
(这是正确的吗?)
delphi - PChar('') 是否保证是指向 #0 的指针(不是 nil)?
我知道在 Delphi 中,一个空字符串(AnsiString 或 WideString)可以用一个 nil 指针表示,也可以用一个指向实际空字符串的指针表示。
通过实验,我已经在 Delphi XE2(具有特定的编译器设置)中证明了这一点PChar('') <> nil
。但这是否得到保证,或者它可能会在未来的版本中发生变化,或者取决于某些编译器设置?
我正面临信任危机。如果有人能给我一个明确的答案,我将不胜感激。
c - fprintf 字符串终止的心理障碍
我对这个完全不知所措。我不知道为什么这不起作用。带有 NULL 终止符的简单字符数组 - 除了当我输出它时,它不会终止!
这是我的输出:
我无法弄清楚为什么这不能正确终止。我试过让数组更长,但每次都得到相同的结果。我快疯了!
有人看到吗?谢谢。
c - 创建一个以 null 结尾的字符串数组,其中大多数字符串数组是静态的
我正在尝试创建一个以 null 结尾的字符串数组。数组中的所有内容在编译时都是已知的,除了在运行时放入其中的一个元素。
这就是我希望数组的外观:
[ ["command1", "arg", "arg", 0], ["command2", 0], argv, ["command3", "arg", 0] ]
所以这里的 command1、command2 和它们的 args 在编译时是已知的,只有 argv 在运行时被放入其中。
问题是我无法完成这项工作。目前我这样做是为了创建一个带有 NUM_COMMANDS(数字)命令的数组:
但它不允许我插入 argv。
我怎样才能把它变成我想要的那种数组?
谢谢!
c - 为什么“%s”格式说明符即使对于没有 `\0` 的字符数组也有效并且一次打印其所有元素?
看下面的代码:
它输出整个name
ERIC。为什么会这样?只有当我们如下%s
初始化字符数组时才应该起作用:name
我没有考虑以下内容,因为这显然假设了一个以空字符结尾的字符数组:
c - 如何连接两个 C 风格(以空结尾)字符串?
我想连接两个定义如下的字符串:
我知道我应该跑过第一个,找到'\0'
标志,而不是开始第二个字符串。功能是否strcat
以相同的方式工作?
我正在使用的代码:
编译后出现这样的错误:
* 检测到堆栈粉碎 * : ./run 终止
我究竟做错了什么?
c - C 字符串在内存中的表示和比较
我有这样的代码:
有些部分我不清楚。我知道内存中以空字符结尾的字符串是字节,所有位都等于 0(ASCII)。这就是为什么当*p != 0
我们决定找到字符串的结尾时。如果我想搜索到零字符,我应该与 48 进行比较,它是DEC
根据 ASCII 在内存中的 0 表示。
但是为什么在访问内存时我们使用HEX
数字,而为了比较我们使用DEC
数字呢?
是否可以比较"\0"
为字符串的结尾?像这样的东西(不工作):
据我了解"\48"
等于0
?
c++ - 为什么 strrchr() 返回 `char*` 而不是 `const char*`?
该函数在( ) 中char* strrchr(const char *str, int ch)
返回一个指针 ( ),其中最后一次出现。char*
str
const char *
ch
因此,我们可以编写以下代码而无需任何强制转换:
char*
return而不是return 有什么好处const char*
?
编辑:
正如Shafik Yaghmour指出的那样, strchr implementation 如何工作有很好的答案?
由于我的代码是 C++,所以我将<cstring>
使用<string.h>
. 感谢您的回答;-)
然而,迈克西摩的回答最适合这个问题。我什至在下面添加了一个更详细的答案,以清楚地说明strrchr()
C 函数(不允许重载),声明同时适合const和非 const字符串。因为strrchr()
可以用非常量字符串调用,所以返回的字符串也应该是非常量的。