当前位置:   article > 正文

snprintf、strncpy、strncat、strncmp、vsnprintf_vsnprintf和snprintf

vsnprintf和snprintf

snprintf

  • 函数原型:int snprintf(char* str,size_t size,const char* format,...);
  • 参数:
    1. str:目标字符串,用于存储格式化后的字符串的字符数组的指针。
    2. size:字符数组的大小。
    3. format:格式化字符串。
    4. …:可变参数,可变数量的参数根据 format 中的格式化指令进行格式化。
  • 返回值:若成功则返回预写入的字符串长度(不包括字符串结尾的空字符’ \0’),若出错则返回负值。
  • 功能说明:
    1. 将可变个参数(…)按照format格式化成字符串,然后将其复制到str中。
    2. 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符(‘\0’)。
    3. 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符(‘\0’)。
    4. 若成功则返回预写入的字符串长度(不包括字符串结尾的空字符’ \0’),若出错则返回负值。
  • 示例代码:
#include <stdio.h>

int main () {
  char a[16];
  size_t i;

  printf("%d\r\n", 1234567890);

  i = snprintf(a, 13, "%d", 1234567890); // 第 1 种情况
  printf("i = %lu, a = %s\r\n", i, a);   // 输出:i = 10, a = 1234567890

  i = snprintf(a,  5, "%d", 1234567890); // 第 2 种情况
  printf("i = %lu, a = %s\r\n", i, a);   // 输出:i = 10, a = 1234

  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

strncpy

  • 函数原型:char *strncpy(char *dest, char *src, int n);
  • 参数:
    1. dest:表示复制的目标字符数组。
    2. src:表示复制的源字符数组。
    3. n:表示复制的字符串长度。
  • 返回值:被复制后的dest字符串的起始地址。
  • 功能说明:
    1. 把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest字符串的起始地址。
    2. src和dest所指内存区域不可重叠且dest必须有足够的空间来容纳src的字符长度+‘\0’。
    3. src串长度 <= dest串长度(这里的串长度包含串尾NUL字符):
      • 如果 n < src 由于长度未达到src NUL,正常复制,特别注意,如果src中有NUL,strncpy复制到NUL即使没到n也提前停止。
      • 如果 n = src 串长度,与strcpy一致。
      • 如果 src 串长度 < n <= dest 串长度,dest 的剩余部分将用NUL填充。
      • 如果 n > dest 串长度,dest栈空间溢出产生崩溃异常。
    4. src串长度 > dest串长度(这里的串长度包含串尾NUL字符):
      • 如果 n < dest 串长度,则替换dest串的前n个字节。
      • 如果 n = dest 串长度,则dest串没有NUL字符,会导致输出乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为’\0’。
      • 如果 n > dest 串长度,dest栈空间溢出产生崩溃异常。
    5. 一般情况下,使用strncpy时,建议将n置为dest串长度。
    6. 无论是strcpy还是strncpy,保证dest串容量(能容纳下src串)才是最重要的。
  • 示例代码:
#include <stdio.h>
#include <string.h>

int main(void){
  char dest[4] = "Hel";
  char src[6] = {'W', 'O', '\0', 'H', 'I', '\0'};

  strncpy(dest, src, 4);

  printf("dest: %s\n",dest); // 输出:dest: WO

  // 输出:dest[0] = W
  //      dest[1] = O
  //      dest[2] = x00
  //      dest[3] = x00
  for(int i = 0; i < sizeof(dest); i++)
  {
    printf("dest[%d] = %c\r\n", i, dest[i]);
  }

  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

strncat

  • 函数原型:char* strncat(char* dest, const char* src, size_t n)
  • 参数:
    1. dest:指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
    2. src:指向源字符串。
    3. n:要追加的最大字符数。
  • 返回值:指向最终的目标字符串 dest 的指针。
  • 功能说明:
    1. src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串。
    2. strncat会将dest字符串最后的’\0’覆盖掉,字符追加完成后,再追加’\0’。
    3. 如果n > src串长度,那么仅将src全部追加到dest的尾部。
    4. 如果n < src串长度,那么会将src的前n个字符附加在dest末尾。
    5. 无论哪种情况,都会在新字符串的末尾添加空字符。
  • 示例代码:
#include <stdio.h>
#include <string.h>

int main ()
{
  char dest[50]  = "AA\0AAAAAAAA";
  char src[50] = "Hello\0World";

  strncat(dest, src, 50);

  printf("src is: | %s |", dest); // 输出:src is: | AAHello |

  return(0);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

strncmp

  • 函数原型:int strncmp(const char *str1, const char *str2, size_t n)
  • 参数:
    1. str1:要进行比较的第一个字符串。
    2. str2: 要进行比较的第二个字符串。
    3. n:要比较的最大字符数。
  • 返回值:
    1. 如果返回值 < 0,则表示 str1 小于 str2。
    2. 如果返回值 > 0,则表示 str2 小于 str1。
    3. 如果返回值 = 0,则表示 str1 等于 str2。
  • 功能说明:
    1. 区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数。
    2. 先将str1字符串的第一个字符的ACSII值减去str2第一个字符的ACSII值(自左向右比较前n个字符,直到出现不同的字符或遇’\0’为止)。若差值为零则继续比较下去;若差值不为零,则返回差值。
    3. 可用于比较两个字符串常量或比较数组和字符串常量,不能比较数字等其他形式的参数。
  • 示例代码:
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[50] = "Hello\0Werld";
  char str2[50] = "Hello\0World";
  char str3[50] = "Jello\0World";

  int res1 = strncmp(str1, str2, 50);
  int res2 = strncmp(str2, str3, 50);
  int res3 = strncmp(str3, str2, 50);

  printf("res1 is: %d\r\n", res1); // 输出:res1 is: 0
  printf("res2 is: %d\r\n", res2); // 输出:res2 is: -2
  printf("res3 is: %d\r\n", res3); // 输出:res3 is: 2

  return(0);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

vsnprintf

  • 函数原型:int vsnprintf(char * str, size_t n, const char * format, va_list arg);
  • 参数:
    1. str:指向存储生成的C字符串的缓存区的指针。
    2. n:缓存区中可以存储的最大字节数,生成的字符串长度最多为n-1(为额外的终止符预留空间)。
    3. format:指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。
    4. arg:va_list变量. va:variable-argument:可变参数。
  • 返回值:
    1. 执行成功,返回最终生成字符串的长度(不包含终止符),若生成字符串的长度大于n,则将字符串的前n-1个字符复制到str,末尾自动附加’\0’,同时将原串的长度返回(不包含终止符)。
    2. 执行失败,返回负值。
  • 功能说明:
    1. 将可变参数格式化输出到一个字符数组。
    2. 用法类似于vsprintf,不过加了size的限制,防止了内存溢出(size为str所指的存储空间的大小)。
    3. 头文件是#include <stdarg.h>。
    4. 仅当此返回值为非负值且小于n时,字符串才完全写入。
  • 示例代码:
#include <stdio.h>
#include <stdarg.h>

void PrintFError ( const char * format, ... )
{
  char buffer[256];
  va_list args;
  va_start(args, format);
  vsnprintf(buffer, 256, format, args);
  perror(buffer);
  va_end(args);
}

int main ()
{
  FILE * pFile;
  char szFileName[]="myfile.txt";

  pFile = fopen(szFileName,"r");
  if (pFile == NULL)
  {
    PrintFError("Error opening '%s'",szFileName);
  }
  else
  {
    fclose (pFile);
  }

  return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

snprintf 百度百科
strncpy 百度百科
strncat 百度百科
strncmp 百度百科
vsnprintf

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/713554
推荐阅读
  

闽ICP备14008679号