我正在尝试使用strtok格式化ASCII艺术风格的字符串。 当我尝试通过IDE运行程序时,它实际上是在打印我的十六进制字符串,因此我不必弄乱其中的所有反斜杠。 但是,当我尝试在控制台(Ubuntu)中运行它时,它没有任何回报。

#include <sys/ioctl.h>
#include <stdio.h>
#include <string.h>

char pacmanText[] = { 0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 
                      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
                      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
                      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0d, 
                      0x0a, 0x7c, 0x20, 0x20, 0x5f, 0x20, 0x5c, 0x20, 0x5f, 0x5f, 
                      0x20, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x5f, 0x20, 
                      0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x5f, 
                      0x5f, 0x20, 0x5f, 0x20, 0x5f, 0x20, 0x5f, 0x5f, 0x20, 0x20, 
                      0x0d, 0x0a, 0x7c, 0x20, 0x7c, 0x5f, 0x29, 0x20, 0x2f, 0x20, 
                      0x5f, 0x60, 0x20, 0x7c, 0x2f, 0x20, 0x5f, 0x5f, 0x7c, 0x20, 
                      0x27, 0x5f, 0x20, 0x60, 0x20, 0x5f, 0x20, 0x5c, 0x20, 0x2f, 
                      0x20, 0x5f, 0x60, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, 0x5c, 
                      0x20, 0x0d, 0x0a, 0x7c, 0x20, 0x20, 0x5f, 0x5f, 0x2f, 0x20, 
                      0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x28, 0x5f, 0x5f, 0x7c, 
                      0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 
                      0x20, 0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 
                      0x20, 0x7c, 0x0d, 0x0a, 0x7c, 0x5f, 0x7c, 0x20, 0x20, 0x20, 
                      0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x5f, 
                      0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 
                      0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x20, 
                      0x7c, 0x5f, 0x7c, 0x0d, 0x0a
}; 

int main() 
{ 
    struct winsize w; 
    ioctl(0, TIOCGWINSZ, &w); 

    char *pch = NULL; 

    pch = strtok(pacmanText, "\n"); 
    while (pch != NULL) 
    { 
        printf("%s", pch); 
        fflush(stdout); 

        pch = strtok(NULL, "\n"); 

    } 
    return 0; 
}

那么谁能告诉我为什么它不能打印该字符串?

#1楼 票数:2

您的字符串中没有'\\0'终止符,只需在数组的结尾0x00处再添加一个元素,您的strtok()就会正确地分割行,问题是您错过了结尾的'\\n'字符线,所以只需更改此

printf("%s", pch);

printf("%s\n", pch);

但是,这样做是没有意义的。 您可以只使用printf("%s", pacmanText);

所以基本的问题是strtok()它将分隔符替换为'\\0'所以当您这样做时

printf("%s", pch);

您没有打印定界符。

#2楼 票数:2 已采纳

问题:

  1. 出于iharob讨论的原因,您需要在pacmanText的末尾使用一个空终止符。
  2. strtok()将修改字符串,以便用'\\0'替换分隔符。 因此,您永远不会在整个程序中打印换行符。

让我们修复以下错误:

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

char pacmanText[] = {
    0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0d, 
    0x0a, 0x7c, 0x20, 0x20, 0x5f, 0x20, 0x5c, 0x20, 0x5f, 0x5f, 
    0x20, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x5f, 0x20, 
    0x5f, 0x5f, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x5f, 
    0x5f, 0x20, 0x5f, 0x20, 0x5f, 0x20, 0x5f, 0x5f, 0x20, 0x20, 
    0x0d, 0x0a, 0x7c, 0x20, 0x7c, 0x5f, 0x29, 0x20, 0x2f, 0x20, 
    0x5f, 0x60, 0x20, 0x7c, 0x2f, 0x20, 0x5f, 0x5f, 0x7c, 0x20, 
    0x27, 0x5f, 0x20, 0x60, 0x20, 0x5f, 0x20, 0x5c, 0x20, 0x2f, 
    0x20, 0x5f, 0x60, 0x20, 0x7c, 0x20, 0x27, 0x5f, 0x20, 0x5c, 
    0x20, 0x0d, 0x0a, 0x7c, 0x20, 0x20, 0x5f, 0x5f, 0x2f, 0x20, 
    0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x28, 0x5f, 0x5f, 0x7c, 
    0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 
    0x20, 0x28, 0x5f, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 0x20, 0x7c, 
    0x20, 0x7c, 0x0d, 0x0a, 0x7c, 0x5f, 0x7c, 0x20, 0x20, 0x20, 
    0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5c, 0x5f, 0x5f, 0x5f, 
    0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 0x7c, 0x20, 0x7c, 0x5f, 
    0x7c, 0x5c, 0x5f, 0x5f, 0x2c, 0x5f, 0x7c, 0x5f, 0x7c, 0x20, 
    0x7c, 0x5f, 0x7c, 0x0d, 0x0a, 0x00
}; 

int main() { 
    char *pch = strtok(pacmanText, "\n"); 
    while (pch != NULL) { 
        printf("%s\n", pch); 
        pch = strtok(NULL, "\n"); 
    } 
}

哪个输出:

[1:08pm][wlynch@watermelon /tmp] ./foo
 ____                                  
|  _ \ __ _  ___ _ __ ___   __ _ _ __  
| |_) / _` |/ __| '_ ` _ \ / _` | '_ \ 
|  __/ (_| | (__| | | | | | (_| | | | |
|_|   \__,_|\___|_| |_| |_|\__,_|_| |_|

  ask by iPh1ps99 translate from so

未解决问题?本站智能推荐:

3回复

C语言中的字符串格式设置和解析

我收到十六进制形式的字符串,输入字符串: "E5A682E682A8" 。 我想在C编程中显示它的字符串。 即,这里3个字节构成一个字符(中文)。 我正在使用以下语句获取输出: 但是我需要从输入字符串获取此格式的帮助。 如何解析和处理此字符串以获得此输出?
1回复

将十六进制字符串转换为 C 中的 uint8_t 数组

我想读取一个文件,将其转换为十六进制字符串,然后将结果保存在一个 8 位(或一个字节)数组中。 我正在逐字符读取文本文件并将其转换为十六进制并成功存储结果字符串,但现在我想将结果字符串数组放入二维数组矩阵中。 我试过这个。 #include <stdio.h> #include <
2回复

将 uint32_t 打印到 C 中的字符串,但不是字面上的值

我正在阅读一个图像文件,我想显示它在控制台中压缩的格式。 例如,我读到: format = 861165636 (0x33545844) ,因为我的 CPU 在 Little Endian 中读写我做format = __builtin_bswap32(format); 所以现在format =
1回复

Python在C语言中的binascii.unhexlify函数

我正在构建一个程序,该程序将输入看作是一个裸MAC地址,然后将其转换为二进制字符串。 我正在嵌入式系统上执行此操作,因此没有STD。 我一直在尝试类似于该问题的方法,但是两天后仍未取得任何进展,我对这些事情真的很不好。 我想要的是输出等于目标,请考虑以下因素: 谢谢,这是一个个
2回复

以十六进制打印字符串 [关闭]

这种以十六进制打印字符串的简短方法是否正确? 如果没有,应该如何修复?
1回复

格式化 C 字符串

我需要按以下格式发送消息: "\\x9F\\x02\\x06\\x00\\x00\\x00\\x07\\x00\\x00\\x9F\\x03\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x9A\\x03\\x15\\x04\\x24" ( "\\x9F\\x02\\x
1回复

将二进制字符串转换为十六进制字符串C

正如标题所述,我对将二进制字符串转换为C中的十六进制字符串的最佳方法感兴趣。二进制字符串最多为4位,因此最好转换为单个十六进制char。 感谢您的帮助,我不确定是否有内置功能可以简化此操作,所以请不要自己尝试发布。
4回复

C:使用RegEx将HEX字符串分隔为Char Aarray

我想像这样转换十六进制字符串: FE2A8D0000CA372D4F461B1D9A1883A32F018823FFFF60D30000484200000D0A0F270300030006000000B0040307000356A3 转换成这种格式: 目前,我在Note