尽管手册页有免责声明,为什么“strchr”似乎可以使用多字节字符?

2024-05-08

From:

man strchr

char *strchr(const char *s, int c);

strchr() 函数返回一个指向字符 c 在字符串 s 中第一次出现的位置的指针。

这里“字符”的意思是“字节”;这些函数不适用于宽字符或多字节字符。

不过,如果我尝试搜索多字节字符,例如é (0xC3A9以 UTF-8 编码):

const char str[] = "This string contains é which is a multi-byte character";
char * pos = strchr(str, (int)'é');
printf("%s\n", pos);
printf("0x%X 0x%X\n", pos[-1], pos[0]); 

我得到以下输出:

� 这是一个多字节字符

0xFFFFFFC3 0xFFFFFFA9

尽管有警告:

警告:多字符字符常量 [-Wmultichar]

这是我的问题:

  • 这是什么意思strchr不适用于多字节字符? (它seems工作,提供int类型足够大以包含最多 4 个字节的多字节)
  • 如何摆脱警告,即如何安全地恢复多字节值并将其存储在 int 中?
  • 为什么要加前缀0xFFFFFF ?

strchr()似乎只适用于您的多字节字符。

内存中实际的字符串是

... c、o、n、t、a、i、n、s、' '、0xC3、0xA9、' '、w ...

你打电话时strchr(),你实际上只是在寻找0xA9,这是低 8 位。这就是为什么pos[-1]具有多字节字符的第一个字节:在搜索过程中它被忽略。

A char在您的系统上签名,这就是为什么您的字符被符号扩展(0xFFFFFF)当你打印出来时。

至于警告,编译器似乎试图告诉您您正在做一些奇怪的事情,而您确实是这样做的。不要忽视它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管手册页有免责声明,为什么“strchr”似乎可以使用多字节字符? 的相关文章

随机推荐

  • 多个 Nodejs 应用程序的单点登录

    我们有 3 个 Nodejs Web 应用程序 在具有多个子域的同一 vps 上的同一域名上运行 并为每个应用程序实现护照身份验证 我们希望单个用户能够使用单个帐户访问所有应用程序 因此我们仅出于帐户管理的目的添加了accounts exa
  • 如何在 Django 管理 UI 的文本区域中保留空行?

    我在一个对象上有一个字段 我使用 Django 3 2 管理 UI 中的文本区域来渲染它这段代码 https stackoverflow com a 431412 就像是 class MyObject models Model some t
  • IPV6 Curl POST 请求

    在 IPV6 中 如何使用 IPV6 地址和端口号构建 CURL POST http 请求 任何类型的线程都将受到赞赏 尝试构建如下请求 gt curl interface http 2001 0 db8 1111 0 0 0 11 809
  • 为什么 UIScrollView 在顶部留有空间并且不滚动到底部

    我是 Objective C 编程新手 我正在使用 UIScrollView 及其上的一些标签 图像和文本视图 我已关闭自动布局 并已尝试打开 调整滚动视图插图 标题中描述的情况 和关闭 不滚动 这是我插入 viewDidLoad 的内容
  • Play 框架 2.0:在 Http.Context 中存储值

    我正在尝试在 Play 框架中的 scalaquery 中实现 基于请求 的会话 我使用 scalaquery 创建一个会话 并尝试将其存储在当前的 http 上下文中 如下所示 def withTransaction A bp BodyP
  • 如何将“重要”添加到 zIndex

    我网站上的某些附加组件之间存在冲突 使用 Firebug 我注意到如果我将 important 添加到 z 索引 我可以避免冲突 但 z index 值是使用 JavaScript 设置的 而不是 CSS 那么如何在以下 JS 代码中添加
  • C# 编译器如何删除发布版本中的 Debug.Assert?

    我最近正在浏览一些代码 并考虑是否需要小心放置在其中的表达式Debug Assert语句 例如昂贵的操作或具有副作用的操作 然而 编译器似乎非常聪明地完全删除了Assert陈述和内在表达 例如 以下内容只会在调试版本上打印 static v
  • 如何在 Silverstripe CMS 中使用 JavaScript?

    我正在使用 SilverStripe 3 0 CMS 并且我需要将 Google 地图包含到 CMS 中 我正在跟进这一步 http www silverstripe org general questions show 14596 pos
  • 有没有一种方法可以通过对一列求和并基于另一列来提取数据

    我正在尝试按帐户按月汇总金额 并将结果按帐户显示在另一个单元格中 AND E1 gt MONTH E1 E8 SUMPRODUCT F 1 F 8 gt MONTH E1 E8 6 D 1 F 8 D1 gt 0 6 Account Amo
  • 在python中访问超级(父)类变量

    我是Python新手 我尝试使用 super 方法访问子类中的父类变量 但它抛出错误 无参数 使用类名访问类变量是可行的 但我想知道是否可以使用 super 方法访问它们 class Parent object props a str a
  • 如何在 EF Core 3 中启用日志记录?

    我正在使用 Entity Framework Core 3 Preview 5 和 ASP NET Core 3 Preview 5 在 Visual Studio 2019 的调试输出窗口中 我没有从 EF Core 获取任何日志 我阅读
  • Azure DevOps/VSTS Build - 在 BUILD BUILDNUMBER 中找不到版本号数据

    设置一个简单的类库来构建并发布到 VSTS 自己的源时 我在 NuGet 包运行时看到此错误 在 BUILD BUILDNUMBER 中找不到版本号数据 我勾选了 使用版本号来版本包 选项 预计 VSTS 能够正常工作 使用内部版本号来版本
  • PHP 准备语句转义的清晰性

    我知道这是一个非常受欢迎的问题 并且已经研究了很多小时 我仍然对明确的答案有点不确定 我不是 PHP 专业人士 并且已经自学了一段时间 我最近刚刚了解 MYSQLi 准备好的语句 已经习惯了旧的做法 我的主要问题是试图找到关于在使用准备好的
  • 连接两列之间的排列

    我需要有关 Excel 作业的帮助 Name City John London Maxx NY Ashley DC Paris 解决这个问题的方法必须是 John london John NY John DC John Paris Maxx
  • 内置魔术变量名称/属性

    背景 对于不熟悉的人来说 崇高的文字 http sublimetext com 和 TextMate 通过以下定义的范围提供语法突出显示和其他功能 tmLanguage语言定义文件 基本上是一堆正则表达式 用于识别给定语言中的各种构造 例如
  • 带有 Firebird 的 .NET 实体框架:UTF-8 数据库出现错误“超出实现限制。块大小超出实现限制”

    我将 Firebird ADO NET 提供程序版本 5 5 与实体框架 5 结合使用 对于 Firebird UTF 8 数据库 带有投影的 LINQ to SQL 查询 包括有条件地将字符串属性设置为常量 会导致错误 超出实现限制 块
  • HWND 子级的 WPF 渲染问题

    我想可以肯定地说 WPF 将其内容呈现为窗口背景 不存在传统 HWND 意义上的子窗口 因此 当人们在 WPF 应用程序中引入基于 HWND 的东西 例如 Web 浏览器 时 视觉外观方面的事情就开始出错 考虑一个窗口有一个带有两个子项的网
  • 使用 Visual Studio 构建 R 包 (C API)

    我正在尝试使用 Visual Studio 构建一个简单的 R 包 这是我的代码 include
  • 快递+护照+会话。为每个页面加载执行查询

    我正在使用 Express 4 2 0 和 Passport 0 2 0 我使用的express session中间件是1 2 1 我对节点身份验证比较陌生 所以请耐心等待 我注意到 对于每个页面加载 护照正在执行数据库请求 Executi
  • 尽管手册页有免责声明,为什么“strchr”似乎可以使用多字节字符?

    From man strchr char strchr const char s int c strchr 函数返回一个指向字符 c 在字符串 s 中第一次出现的位置的指针 这里 字符 的意思是 字节 这些函数不适用于宽字符或多字节字符 不