c - 将 CHAR16 变量添加到字符串
问题描述
我是 C 的新手,正在尝试修改和编译 EDK2 EFI 程序。
我要更改的程序部分有一个函数MsgLog
,它接受一个Char16 *
变量并使用它来写入日志文件。
当前代码有这个
MsgLog("SomeText ...%r\n", Status);
状态是一个 EFI_STATUS,可以是“成功”或“未找到”。IE,您可以在日志文件中获取以下内容:
SomeText ...Success
或者
SomeText ...Not Found
我想将其更改为:
SomeText ...Success : ABC
或者
SomeText ...Not Found : XYZ
我已经加载 : ABC
或 : XYZ
进入一个Char16 *
变量(必须是 Char16 * 以匹配用于设置它的函数的其他限制)
然后我尝试了各种选项将其附加到字符串中,例如
MsgLog("SomeText ...%r%s\n", Status, myVariable);
和
MsgLog("SomeText ...%r%r\n", Status, myVariable);
但我最终得到
SomeText ...Success<null string>
和
SomeText ...Not Found<null string>
我不确定我应该使用什么格式占位符,或者我是否应该或如何将 myVariable 转换为其他适当的格式,并希望得到一些指示。
请注意,这是一个更广泛的程序,我正在更改其中的一小部分,并且我没有定义不同变量类型的范围。
编辑:添加上下文
原始工作代码
EFI_STATUS Funct_A()
{
EFI_STATUS Status;
//Funct_B returns EFI_SUCCESS or EFI_NOT_FOUND
Status = Funct_B();
MsgLog("SomeText ...%r\n", Status);
问题代码
EFI_STATUS Funct_A()
{
EFI_STATUS Status;
CHAR16 *myVariable = NULL;
//Funct_B returns EFI_SUCCESS or EFI_NOT_FOUND
Status = Funct_B();
// From some header file, I see "#define SPrint UnicodeSPrint". Not 100% sure it is the relevant one
// From other code implementations, I know SPrint takes "CHAR16" as first variable.
if (!EFI_ERROR (Status)) {
SPrint (myVariable, 255, L" : ABC");
} else {
SPrint (myVariable, 255, L" : XYZ");
}
MsgLog("SomeText ...%r%r\n", Status, myVariable);
// MsgLog is a bit of a rabbit's warren and I can't provide all the background but it expects "CHAR16".
解决方案
SPrint (myVariable, 255, L" : ABC");
是错的。myVariable
是NULL
- 您不能写入NULL
指针。如果你想使用,你必须实际为字符串分配内存SPrint
。有关更多信息,请查看您对指针和snprintf
标准 C 函数的了解。的第二个参数SPrint
实际上是分配内存的大小 - 你没有分配内存,所以255
只是无效。
CHAR16 myVariable[255];
SPrint(myVariable, sizeof(myVariable), L" : ABC");
但在你的情况下,这没有任何意义。首先,没有必要使用SPrint
- 你不使用格式化字符串。一个简单的StrCpy
(即标准wcscpy
/的替代品strcpy
)就足够了。但是就是说,您根本不需要任何内存,只需使用指针指向字符串文字即可。
const CHAR16 *myVariable = NULL;
if (!EFI_ERROR (Status)) {
myVariable = L" : ABC";
} else {
myVariable = L" : XYZ";
}
// or simpler
myVariable = !EFI_ERROR (Status) ? L" : ABC" : L" : XYZ";
推荐阅读
- reactjs - 反应蚂蚁设计日期时间选择器值单独保存
- c++ - CListCtrl::InsertItem 成功但没有显示
- python - pygit2:如何“git remote set-branches origin remote_branch_name”
- arrays - 在 Ruby 中创建一个数组
- python - 获取列表的总和
- apache-spark - PySpark 删除所有列名中所有特殊字符的特殊字符
- go - 如何将数据发送到 gohtml 模板
- javascript - 如何更改子节点 css?
- javascript - 如何排序取决于 JS 中对象的 '001'、'002' 之类的 'key'
- parsing - 在 Teradata 中解析具有可变格式的维度字段?