15

所以我有一个具有一定字节数(或长度)的字符串。我说字节是因为字符串末尾没有 NULL 终止符。不过,我知道字符串有多长。通常,众所周知,当 you 时printf("%s", str);,它会继续打印每个字节,直到达到 NULL 字符。我知道没有不是 NULL 终止的 C 字符串,但是我有一个奇怪的情况,我正在存储东西(不是特别是字符串)并且我不存储 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);

但我知道你不能那样做。但是让您了解我要完成的工作。

4

3 回答 3

38

printf("%.*s", len, str);

而且,没有不以 NULL 结尾的 C 字符串。

于 2013-03-13T03:57:24.893 回答
2

你可以这样做:

for (int i =0; i<len; i++)
{
    printf("%c", str[i]);
}

它将在同一行打印它们,循环打印您需要打印的任何长度。

于 2013-03-13T05:43:10.297 回答
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");
  } 
于 2013-05-17T22:40:13.797 回答