gpt4 book ai didi

c - 查找不可打印的字符并在 C 中打印出它们的十六进制形式

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:05 25 4
gpt4 key购买 nike

我目前有一个有限状态机,它分析一个长字符串,用空格分隔长字符串,并将每个标记分析为八进制、十六进制、 float 、错误等。

以下是我如何分析每个标记的简要概述:

enum state mystate = start_state; 

while (current_index <= end_index - 1) { // iterate through whole token
switch (mystate) {
case 0:
// analyze first character and move to appropriate state
// cases 1-5 represent the valid states, if error set mystate = 6
case 6: // this is the error state
current_index = end_index - 1; // end loop
break;
}
current_index++;
}

在此循环结束时,我分析了我的 token 所处的状态,例如 token 是否不属于任何类别并且它进入了状态 6(错误状态):

if (mystate == 6) {
// token is char pointer to string token
fprintf(stdout, "Error: \" %s \" is invalid\n", token);
}

现在,我应该以十六进制形式打印出 0x20 及以下的不可打印字符,例如文本开头、标题开头等,例如 [0x02] 和 [0x01]。我从 0x20 和以下位置找到了一份很好的 ASCII 不可打印字符列表:http://www.theasciicode.com.ar/ascii-control-characters/start-of-header-ascii-code-1.html

首先,我很困惑如何在命令行中输入不可打印的字符。如何键入不可打印的字符作为我的程序分析的命令行参数?

在那道障碍之后,我知道不可打印的字符将落入状态 6,即我的错误状态。所以我必须稍微修改我的错误状态 if 语句。这是我在伪代码中如何做到这一点的思考过程:

if (mystate == 6) {
if (token is equal to unprintable character) {
// print hex form, use 0x%x for formatting
} else {
// still error, but not unprintable so just have original error statement
fprintf(stdout, "Error: \" %s \" is invalid\n", token);
}
}

我的另一个想法是:

if (mystate == 6) {
if (the token's hex value is between 0x01 and 0x20) {
// print hex form, use 0x%x for formatting
} else {
// still error, but not unprintable so just have original error statement
fprintf(stdout, "Error: \" %s \" is invalid\n", token);
}
}

最佳答案

有了理智的 libc,你会使用

#include <ctype.h>
...
if (!isprint((int)ch) {
unsigned x = ch;
printf ("[0x%02x]", 0xff&(int)ch);
}
...

要查找不可打印的 ascii 字符,假设 char ch 是您当前输入的字符。

要在命令行中使用它们,您可以从命令行使用 printf(1)。

printf '\x02'|xxd
0000000: 02

您会看到 STX 字符。顺便提一句。有一个关于 ascii (ascii(7)) 的优秀手册页!

作为一个完整的命令行:

YOUR_Program "`printf '\x02\x03\x18\x19'`"

(xxd 只是为了展示 printf 的结果,因为它是不可打印的)。 xxd 只是一个 hexdump 实用程序,类似于 od。

注意:当您确实需要不可打印的输入时,从文件或标准输入中获取输入更为方便。这简化了您的程序调用:

printf '\x02\x03\x18\x19'|YOUR_Program

关于c - 查找不可打印的字符并在 C 中打印出它们的十六进制形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31187471/

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