如何为指针打印空终止字符 \0

How to print null terminating character \0 for a pointer

在 C 中,假设您有以下内容:

char * myString = "EMMA";

如何打印出 myString[4] 并得到 [=12=]

简单方法:

write(1, myString + 4, 1);

便携方式:

fwrite(mystring + 4, 1, 1, stdout);

0'[=13=]' 的代码,因为在 C 中 char 类型实际上是 int 类型,在这种情况下它们是相同的。

'[=13=]' 是一个 non-printable 字符,或者如果您更喜欢 non-printable 控制信号。

也就是说你可以打印它的代码:

printf("%d", myString[4]);

这当然会打印 0

如果你想打印实际的 '[=13=]' 你可以用一个简单的条件来完成:

const char* nulchar = "\0";

if(myString[4] == 0)
    printf("%s", nulchar);

您需要自己编写函数以C escape chars.

的形式打印不可打印的字符
void myprint(const char *str)
{
    size_t n = 0;
    do
    {
        printf("str[%4zu]=", n++);
        switch(*str)
        {
            case '[=10=]':
                printf("`\0`\n");
                break;
            case '\n':
                printf("`\n`\n");
                break;
            case '\r':
                printf("`\r`\n");
                break;
            case '\b':
                printf("`\b`\n");
                break;
            case '\t':
                printf("`\t`\n");
                break;
            case '\v':
                printf("`\v`\n");
                break;
            default:
                if(isprint((unsigned char) *str))
                    printf("'%c'\n", *str);
                else
                    printf("'\x%02hhx'\n", *str);
        }
    }while(*str++);
}

int main(void)
{
    myprint("Te\xf0st\t\n\r");
}

https://godbolt.org/z/WahMbb

"I did try the %c you get a blank. I mean with "get" print out to the terminal [=20=]."

使用 %c 打印 '[=14=]' 总是看不到输出,因为 '[=14=]' 是转义序列,不可打印。


C 标准保证每个字符串文字以 NUL 字节结尾:

In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals.

C18, §6.4.5/6

所以实际上,你可以这样做

const char * myString = "EMMA";

fputs(myString, stdin);
puts("\0");

printf() 变体:

const char * myString = "EMMA";

printf("%s%s\n", myString, "\0");

如果你只想在字符串后打印出[=18=],当字符串字面值myString指向变化时,这也能保持安全。

输出(两种变体):

EMMA[=12=]

没有与终止符关联的可打印字符(这就是它用作终止符的原因,它不是“正常”字符值)。

字符 '0' 具有 non-zero 编码(ASCII 中的 48)。

如果你想在字符串后面显示尾随 0[=13=],你需要使用如下技巧:

printf( "%s\%d\n", mystring, mystring[ strlen(mystring) ] );

应该输出EMMA[=14=].

printf 中使用 %s 作为:

#include <stdio.h>

int main()
{
    char * myString = "EMMA";
    
    printf("myString[4]=%s", myString[4]);

    return 0;
}

你得到:

myString[4]=(null)

但是...带有以下警告:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]

因此,如果这只是查看打印出的“NULL”的一种快速而肮脏的方式,就足够了。