将CHAR16变量添加到字符串

问题描述

我是C语言的新手,正在尝试修改和编译EDK2 EFI程序。

我要更改的程序部分具有函数MsgLog,该函数带有一个Char16 *变量,并使用该变量将其写入日志文件

当前代码具有此

MsgLog("SomeText ...%r\n",Status);

状态是EFI_STATUS,可以为“成功”或“未找到”。即,您可以在日志文件中获得以下内容

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",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,L" : XYZ");
    }

    MsgLog("SomeText ...%r%r\n",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");是错误的。 myVariableNULL-您无法写入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";