c-如何为指针打印null终止字符\0



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

char * myString = "EMMA";

如何打印出myString[4]并获得

您需要编写自己的函数,以C escape chars的形式打印不可打印的字符。

void myprint(const char *str)
{
size_t n = 0;
do
{
printf("str[%4zu]=", n++);
switch(*str)
{
case '':
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("Texf0sttnr");
}

https://godbolt.org/z/WahMbb

0''的代码,由于在C中char类型实际上是int类型,因此在这种情况下它们是相同的。

''是不可打印的字符,或者如果您喜欢不可打印控制信号。

也就是说,你可以使用打印它的代码

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

当然,这将打印0

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

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

"我确实试过%c,但你没有。我的意思是用";得到";打印到终端\0;

使用%c打印''总是不会得到可见的输出,因为''是转义序列,不可打印。


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

在翻译阶段7,值为零的字节或代码被附加到由一个或多个字符串文字产生的每个多字节字符序列。

C18,§6.4.5/6

所以实际上,你可以只做

const char * myString = "EMMA";
fputs(myString, stdin);
puts("\0");

printf()变体:

const char * myString = "EMMA";
printf("%s%sn", myString, "\0");

如果您只想在字符串之后打印出,那么当字符串文字myString指向更改时,它也会保持安全。

输出(两种变体(:

EMMA

简单的方法:

write(1, myString + 4, 1);

便携式方式:

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

没有可打印的字符与终止符相关联(这就是为什么它被用作终止符,它不是一个"正常"字符值(。

字符'0'具有非零编码(ASCII中为48(。

如果你想在字符串后面显示一个尾随的0,你需要使用一些技巧,比如:

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

应输出CCD_ 21。

使用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";打印出来就足够了。

最新更新