所以我有一个字符串,它有一定的字节数(或长度)。我说字节是因为字符串末尾没有NULL终止符。虽然,我知道字符串有多长。通常,正如我们所知,当你printf("%s", str);
时,它将继续打印每个字节,直到它变为NULL字符。我知道没有C字符串不是NULL终止,但我有一个奇怪的情况,我存储的东西(不是特定的字符串),我不存储NULL,但“事物”的长度。
这是一个小样本:
char* str = "Hello_World"; //Let's use our imagination and pretend this doesn't have a NULL terminator after the 'd' in World
long len = 5;
//Print the first 'len' bytes (or char's) of 'str'
我知道你可以这样做:
printf("%.5s", str);
但是在这种情况下,我很难对5进行编码,尽管在我的情况下,5是在变量中。我会做这样的事情:
printf("%.(%l)s", len, str);
但我知道你做不到。但是让你知道我想要完成的事情。
答案 0 :(得分:25)
printf("%.*s", len, str);
并且,没有没有以NULL结尾的C字符串。
答案 1 :(得分:2)
你可以这样做:
for (int i =0; i<len; i++)
{
printf("%c", str[i]);
}
将在相同的行中打印它们,循环播放您需要打印的任何长度。
答案 2 :(得分:0)
你可以像这样检测空字节中毒。程序将显示检测到的中毒字节
char filename[] = "path/image.php\0.bmp";
if ((sizeof(filename) - 1) == strlen(filename)) {
printf("%s %s", "No poisoning Null Byte detected" , "\n");
FILE *fp;
fp = fopen(filename, "r");
if ( fp == NULL ) {
perror ( "Unable to open the file" );
exit ( 1 );
}
fread ( buf, 1, sizeof buf, fp );
printf ( "%s\n", buf );
fclose ( fp );
} else {
printf("%s %s", "Poisoning Null Byte detected" , "\n");
}