字符串不会在 C 中打印自己

String wouldn't print itself in C

我正在尝试使用 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; 
}

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

你的字符串中没有 '[=13=]' 终止符,只需在数组的末尾再添加一个元素 0x00,你的 strtok() 也正确地拆分了行,问题是你错过了行尾的 '\n' 字符吗,所以只需更改此

printf("%s", pch);

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

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

所以根本问题是 strtok() 它将分隔符替换为 '[=13=]' 所以当你这样做时

printf("%s", pch);

您没有打印定界符。

问题:

  1. 由于 .
  2. 的原因,您需要在 pacmanText 末尾使用一个空终止符
  3. strtok() 将修改字符串,将分隔符替换为 '[=14=]'。所以你永远不会在整个程序中打印换行符。

让我们修复这些错误:

#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
 ____                                  
|  _ \ __ _  ___ _ __ ___   __ _ _ __  
| |_) / _` |/ __| '_ ` _ \ / _` | '_ \ 
|  __/ (_| | (__| | | | | | (_| | | | |
|_|   \__,_|\___|_| |_| |_|\__,_|_| |_|