sprintf函数接受十六进制值并创建一个包含所有ACII值的字符串

jq6vz3qz  于 2023-11-16  发布在  其他
关注(0)|答案(2)|浏览(101)

我在C中使用了一个sprintf函数,我用这种方式创建了第一个工作程序:

sprintf((char*)(command),"\"\x1F\"\r");

字符串
这是正常工作的,因为它为这个特定的十六进制值0x 1F打印了相应的ASCII字符。
下一点是,我想做同样的事情,但有一个变量:

sprintf((char*)(command),"\"\\x%x\"\r",var);


我尝试了不同的方式,但没有工作。
预期的输出是这样的“u}”对应于ASCII转换后的十六进制值”如果我使用变量,我只得到1F打印。
有什么建议吗?

e3bfsja2

e3bfsja21#

所以如果我理解正确的话,你有一个“ASCII值”(例如0x1F),你从一些输入源(比如用户)获得,并希望显示这个值(或者更确切地说,对应的ASCII字符)。

char const ascii_value = 0x1F;
printf("\"%c\"\r", ascii_value);

字符串
转换格式说明符%c需要一个char类型的参数,并将只显示该字符(因此不是“1F”,而是不可打印的“单位分隔符”)。
当然,对于char值,你并不真正需要这个..因为char var = 0x1F * 已经是你想要的“ASCII字符”了。为了进一步说明这一点:

#include <assert.h>
#include <stdio.h>
#include <string.h>

int main() {
    char manually[20] = {0};
    manually[0] = '"';
    manually[1] = 0x1F; // Direct assignment of value 0x1F to char
    manually[2] = '"';
    manually[3] = '\r';
    char buffer[20] = {0};
    snprintf(buffer, 20, "\"\x1F\"\r");
    if (memcmp(manually, buffer, 20) == 0)
    {
        puts("Same");
    }
    else
    {
        puts("Different");
    }
    return 0;
}


这将输出“相同”。(https://ideone.com/3pr51b

mitkmikd

mitkmikd2#

转义序列\x的处理不是由sprintf()完成的,而是由编译器在将字符串转换为数据时完成的。所以当你写"\"\x1F\""时,字符串实际上包含一个代码为0x1f的字节。
因此,使用\\x产生的文字\x化字符串不会导致它被视为转义序列。
如果要将字节值放入结果中,请使用%c

sprintf(command, "\"%c\"", var);

字符串

相关问题