128。假设我将这个字符串存储在 unsigned char 数组-6ren">
gpt4 book ai didi

c - 将无符号字符数组传递给字符串函数

转载 作者:行者123 更新时间:2023-12-04 11:48:35 24 4
gpt4 key购买 nike

假设我有一些 utf8 编码的字符串。在其中,单词使用 ";" 分隔。但是这个字符串中的每个字符(";" 除外)都有 utf8 值 >128。假设我将这个字符串存储在 unsigned char 数组中:

unsigned char buff[]="someutf8string;separated;with;";

将此 buff 传递给 strtok 函数是否安全? (如果我只想使用 ";" 符号提取单词)。

我担心的是 strtok(或 strcpy)期望 char 指针,但在我的内部string 一些值将具有 > 128 的值。那么这个行为有定义吗?

最佳答案

不,它不安全——但如果它编译它几乎肯定会按预期工作。

unsigned char buff[]="someutf8string;separated;with;";

这很好;该标准特别允许字符类型的数组(包括 unsigned char)使用字符串文字进行初始化。字符串文字的连续字节初始化数组的元素。

strtok(buff, ";")

这是一个约束冲突,需要编译时诊断。 (这与 C 标准接近说某事是非法的差不多。)

strok 的第一个参数是 char* 类型,但您传递的是 unsigned char* 类型的参数。这两种指针类型不兼容,它们之间没有隐式转换。符合规范的编译器可能会拒绝您的程序,如果它包含这样的调用(例如,gcc -std=c99 -pedantic-errors 会拒绝它。)

许多 C 编译器在严格执行标准要求方面有些松懈。在许多情况下,编译器会针对包含约束违规的代码发出警告——这是完全有效的。但是一旦编译器诊断出违反约束并继续生成可执行文件,该可执行文件的行为就不是由 C 标准定义的。

据我所知,任何不拒绝此调用的实际编译器都会生成行为与您期望的一样的代码。指针类型 char*unsigned char* 几乎可以肯定具有相同的表示形式并以与参数相同的方式传递,类型 charunsigned char 明确要求对非负值具有相同的表示形式。即使对于超过 CHAR_MAX 的值(如您正在使用的值),编译器也必须竭尽全力生成行为不当的代码。您可能会在不对有符号整数使用 2 的补码的系统上遇到问题,但您不太可能遇到这样的系统。

如果您添加显式强制转换:

strtok((char*)buff, ";")

移除了约束违规并且可能会消除任何警告——但行为仍然是严格未定义的。

但在实践中,大多数编译器试图几乎互换地对待 charsigned charunsigned char,部分原因是为了迎合代码喜欢你的,部分原因是他们不得不竭尽全力去做其他事情。

关于c - 将无符号字符数组传递给字符串函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24767522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com