C/C++ snprintf()

时间:2020-02-23 14:32:06  来源:igfitidea点击:

在本文中,我们将了解snprintf()C++函数的工作和用法。

snprintf()函数用于将格式化的输出写入字符串。
通过显示其语法并提供示例,来了解如何使用此功能。

C/C++中snprintf()的基本语法

由于snprintf()函数将写入字符串缓冲区,因此它将字符串作为参数,以及格式化的字符串。

格式化的字符串是任何包含格式说明符的字符串,例如%d,%c或者%s。
这类似于printf()或者cout,不同的是它将写入一个字符串。

基本功能签名如下:

int snprintf (char* buffer, size_t buf_size, const char* format);

其中" buffer"是我们将写入的字符串缓冲区,最大容量为" buf_size"。
format是我们将写入缓冲区的格式字符串。

注意:缓冲区是一个字符数组(" char *"),而不是一个"字符串"。
这是因为这是C兼容函数,并且C没有string类。

如果执行成功,如果没有问题,它将返回已写入的字符数。
否则,它将返回一个负整数。

如果缓冲区大小太小,则输入字符串将被截断为缓冲区大小。

printf()类似,这是在<stdio.h>中定义的库函数。

#include <stdio.h>

int snprintf (char* buffer, size_t buf_size, const char * format);

现在让我们看一下此功能的一些示例。

在C/C++中使用snprintf()

我们将使用包含一些整数和字符串的格式字符串,并将其写入缓冲区。

假设采用以下格式的格式字符串:

Hello %s, your roll number is %d.

现在,我们将使用snprintf()将其写入缓冲区。

#include <stdio.h>

int main() {
  //Allocate stack memory for our buffer
  char buffer[256];
  char name[20] = "Amit";
  int num_read = snprintf(buffer, sizeof(buffer), "Hello %s, your roll number is %d", name, 10);
  if (num_read < 0) {
      fprintf(stderr, "Error while writing to buffer\n");
      return -1;
   }
  printf("Buffer written successfully!\nNumber of characters read: %d\nContent of buffer: %s\n", num_read, buffer);
  return 0;
}

输出

Buffer written successfully!
Number of characters read: 33
Content of buffer: Hello Amit, your roll number is 10

如您所见,我们的缓冲区确实已使用格式字符串内容进行了更新!

让我们以另一种情况为例,当您尝试编写一个对于我们的缓冲区来说太大的字符串时。
其中让我们将缓冲区的大小设为20,然后尝试看看会发生什么。

#include <stdio.h>

int main() {
  //Allocate stack memory for our buffer
  char buffer[20];
  char name[20] = "Amit";
  int num_read = snprintf(buffer, sizeof(buffer), "Hello %s, your roll number is %d", name, 10);
  if (num_read < 0) {
      fprintf(stderr, "Error while writing to buffer\n");
      return -1;
  }
  printf("Buffer written successfully! Number of characters read: %d, Content of buffer: %s\n", num_read, buffer);
  return 0;
}

输出

Buffer written successfully! Number of characters read: 34, Content of buffer: Hello Amit, your ro

即使我们读取的字符数与以前一样(34),由于缓冲区大小不够大,因此格式字符串会减小为缓冲区大小。

因此,我们的输出仅包含20个字符,与缓冲区的大小相同。