当字符串的长度大于n时,如何打印字符串前n个字节?

时间:2013-03-13 03:54:04

标签: c string byte printf

所以我有一个字符串,它有一定的字节数(或长度)。我说字节是因为字符串末尾没有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);

但我知道你做不到。但是让你知道我想要完成的事情。

3 个答案:

答案 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");
  }