如何为指针打印空终止字符 \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");
}
"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”的一种快速而肮脏的方式,就足够了。
在 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");
}
"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”的一种快速而肮脏的方式,就足够了。