C/C++中关于字符串的常见函数操作大全

 更新时间:2023年03月22日 09:30:07   作者:Star_ID  
这篇文章主要介绍了C/C++中关于字符串的常见函数操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

wcsncpy_s

wcsncpy_s:将一个宽字符串的字符复制到另一个宽字符串。定义在头文件<wchar.h>

errno_t wcsncpy_s(
   wchar_t *strDest,
   size_t numberOfElements,
   const wchar_t *strSource,
   size_t count
);
参数说明
strDest目标字符串
numberOfElements目标字符串的大小(以字符为单位)
strSource资源字符串
count要复制的字符数

示例

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
    const wchar_t src[] = L"南京";
    wchar_t dest[6] = { L'北', L'京', L'上', L'海', L'深' };

    wcsncpy_s(dest, 3, src, 3);

    puts("The contents of dest are: ");
    setlocale(LC_ALL, "en_US.utf8");

    const long dest_size = sizeof dest / sizeof * dest; // dest_size = 6

    for (wchar_t* p = dest; p - dest != dest_size; ++p) {
        if (*p)
            printf("%lc ", *p);
        else
            printf("\\0 ");
    }
}

结果

The contents of dest are:
南 京 \0 海 深 \0

swprintf_s

swprintf_s:将设置格式的数据写入字符串。定义在头文件<stdio.h> 或 <wchar.h>

int swprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   ...
);
参数说明
buffer输出的存储位置
sizeOfBuffer可存储的最多字符数
format格式控件字符串
要设置格式的可选参数

示例

#include <stdio.h>

int main(void)
{
	char  buffer[200], s[] = "computer", c = 'l';
	int   i = 35, j;
	float fp = 1.7320534f;

	// Format and print various data:
	j = sprintf_s(buffer, 200, "String:%s\n", s);
	j += sprintf_s(buffer + j, 200 - j, "Character:%c\n", c);
	j += sprintf_s(buffer + j, 200 - j, "Integer:%d\n", i);
	j += sprintf_s(buffer + j, 200 - j, "Real:%f\n", fp);

	printf_s("Output:\n%s\ncharacter count = %d\n", buffer, j);
}

输出

Output:
String:computer
Character:l
Integer:35
Real:1.732053

character count = 53

memset

memset:将 ptr 指向的内存块的前 num 字节设置为指定值(解释为无符号字符)。定义在头文件string.h

void * memset ( void * ptr, int value, size_t num );
参数说明
ptr指向要填充的内存块的指针
value要设置的值。 该值作为 int 传递,但该函数使用该值的无符号字符转换填充内存块。
num要设置为值的字节数。size_t 是无符号整数类型。

示例

/* memset example */
#include <stdio.h>
#include <string.h>

int main()
{
	char str[] = "almost every programmer should know memset!";
	memset(str, '-', 5);
	puts(str);
	return 0;
}

输出

-----t every programmer should know memset!

memcmp

memcmp:将 ptr1 指向的内存块的前 num 字节与 ptr2 指向的前 num 字节进行比较,如果它们都匹配则返回零,否则返回一个不同于零的值,表示如果它们不匹配则哪个更大。定义在string.h中。

请注意,与 strcmp 不同,该函数在找到空字符后不会停止比较。

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
参数说明
ptr1内存块的指针
ptr2内存块的指针
num比较的字节数
返回值说明
<0两个内存块中不匹配的第一个字节在 ptr1 中的值小于 ptr2 中的值(如果评估为 unsigned char 值)
>0两个内存块中不匹配的第一个字节在 ptr1 中的值大于在 ptr2 中的值(如果评估为 unsigned char 值)
=0两个内存块的内容相等
/* memcmp example */
#include <stdio.h>
#include <string.h>

int main()
{
	char buffer1[] = "DWgaOtP12df0";
	char buffer2[] = "DWGAOTP12DF0";

	int n;

	n = memcmp(buffer1, buffer2, sizeof(buffer1));

	if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
	else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);
	else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);

	return 0;
}

输出

'DWgaOtP12df0' is greater than 'DWGAOTP12DF0'.

memcpy

memcpy:将 num 个字节的值从 source 指向的位置直接复制到 destination 指向的内存块。

void * memcpy ( void * destination, const void * source, size_t num );

示例

/* memcpy example */
#include <stdio.h>
#include <string.h>

struct {
  char name[40];
  int age;
} person, person_copy;

int main ()
{
  char myname[] = "Pierre de Fermat";

  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;

  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );

  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );

  return 0;
}
 Edit & Run

输出

person_copy: Pierre de Fermat, 46

wcslen

wcslen:返回C宽字符串的长度

size_t wcslen (const wchar_t* wcs);

示例

/* wcslen example */
#include <stdio.h>
#include <wchar.h>

int main()
{
	wchar_t wsInput[256];
	wprintf(L"Enter a sentence: ");
	fgetws(wsInput, 256, stdin);  /* includes newline characters */
	wprintf(L"You entered %u characters.\n", wcslen(wsInput));
	return 0;
}

输出

Enter a sentence: 南京
You entered 5 characters.

LoadStringW

LoadStringW不是C/C++中标准库函数,而是windows的一个接口。定义在libloaderapi.h头文件中。从与指定模块关联的可执行文件中加载字符串资源,并将该字符串复制到具有终止 null 字符的缓冲区中,或者返回指向字符串资源本身的只读指针。

int LoadStringW(
  [in, optional] HINSTANCE hInstance,
  [in]           UINT      uID,
  [out]          LPWSTR    lpBuffer,
  [in]           int       cchBufferMax
);
参数说明
hInstance其可执行文件包含字符串资源的模块实例的句柄
uID要加载的字符串的标识符
lpBuffer用于接收字符串或指向字符串资源本身的只读指针的缓冲区
cchBufferMax缓冲区的大小,以字符为单位

GetModuleHandleW

GetModuleHandleW不是C/C++中标准库函数,而是windows的一个接口。定义在libloaderapi.h头文件中。检索指定模块的模块句柄。该模块必须已由调用进程加载。

HMODULE GetModuleHandleW(
  [in, optional] LPCWSTR lpModuleName
);

lpModuleName:加载的模块的名称(.dll或.exe文件)。如果省略文件扩展名,则会追加默认的库扩展名.dll。文件名字符串可以包含尾随点字符 (.),以指示模块名称没有扩展名。该字符串不必指定路径。指定路径时,请确保使用反斜杠 (\),而不是正斜杠 (/)。该名称将与当前映射到调用进程的地址空间的模块的名称进行比较(大小写独立)。

如果此参数为 NULL,则 GetModuleHandle 将返回用于创建调用进程的文件的句柄(.exe文件)。

以下几个函数是Rpcrt4.dll动态库中的。

UuidFromStringW

UuidFromStringW:转换一个字符串为Uuid结构。定义在rpcdce.h头文件中

RPC_STATUS UuidFromStringW(
  RPC_WSTR StringUuid,
  UUID     *Uuid
);
参数说明
StringUuid指向 UUID 的字符串表示形式的指针
Uuid以二进制形式返回指向 UUID 的指针

UUID 结构定义了通用唯一标识符 (UUID)。UUID 提供对象(如接口、管理器入口点向量或客户端对象)的唯一指定。UUID 结构是 GUID 结构的同义词。

typedef GUID UUID;

GUID 标识对象,有如 COM 接口、COM 类对象或管理器入口点向量 (EPV)。GUID 是一个 128 位值,由一组 8 个十六进制数字组成,后跟三组,每组 4 个十六进制数字,后跟一组 12 个十六进制数字。以下示例 GUID 显示了 GUID 中十六进制数字的分组:6B29FC40-CA47-1067-B31D-00DD010662DA。

typedef struct _GUID {
  unsigned long  Data1;
  unsigned short Data2;
  unsigned short Data3;
  unsigned char  Data4[8];
} GUID;

UuidCompare

UuidCompare:比较两个 UUID并确定它们的顺序。返回值给出顺序。

signed int UuidCompare(
  UUID       *Uuid1,
  UUID       *Uuid2,
  RPC_STATUS *Status
);
参数说明
Uuid1指向 UUID 的指针
Uuid2指向 UUID 的指针
Status返回可能发生的任何错误,并且通常由函数设置为在返回时RPC_S_OK
返回值意义
–1Uuid1 参数小于 Uuid2 参数
0Uuid1 参数等于 Uuid2 参数
1Uuid1 参数大于 Uuid2 参数

UuidHash

UuidHash:应用程序调用 UuidHash 函数为指定的 UUID 生成哈希值。

unsigned short UuidHash(
  UUID       *Uuid,
  RPC_STATUS *Status
);
参数说明
Uuid为其创建哈希值的 UUID
Status返回RPC_S_OK

UuidCreate

UuidCreate:创建一个新的 UUID

RPC_STATUS UuidCreate(
  UUID *Uuid
);

Uuid:返回指向创建的 UUID 的指针

返回值意义
RPC_S_OK调用成功
RPC_S_UUID_LOCAL_ONLYUUID保证仅对此计算机是唯一的
RPC_S_UUID_NO_ADDRESS无法获取此计算机的以太网或令牌环硬件地址

wcstok_s

strtok_s, _strtok_s_l, wcstok_s, _wcstok_s_l, _mbstok_s, _mbstok_s_l

通过使用当前区域设置或传入的区域设置,查找字符串中的下一个标记

wchar_t* wcstok_s(
   wchar_t* str,
   const wchar_t* delimiters,
   wchar_t** context
);

atoi, , ,_atoi_l_wtoi_wtoi_l

将字符串转换为整数。

int _wtoi(
   const wchar_t *str
);

_wcstombs_s_l

_wcstombs_s_l:将宽字符序列转换为相应的多字节字符序列。

errno_t _wcstombs_s_l(
   size_t *pReturnValue,
   char *mbstr,
   size_t sizeInBytes,
   const wchar_t *wcstr,
   size_t count,
   _locale_t locale
);
参数含义
pReturnValue转换后的字符串的大小(以字节为单位),包括空终止符。
mbstr转换后的多字节字符串的缓冲区地址。
sizeInBytesmbstr 缓冲区的大小(以字节为单位)。
wcstr指向要转换的宽字符串。
count要存储在 mbstr 缓冲区中的最大字节数,不包括终止空字符或 _TRUNCATE
locale要使用的语言环境

WritePrivateProfileStringA

WritePrivateProfileStringA:将字符串复制到初始化文件的指定部分。

BOOL WritePrivateProfileStringA(
  [in] LPCSTR lpAppName,
  [in] LPCSTR lpKeyName,
  [in] LPCSTR lpString,
  [in] LPCSTR lpFileName
);
参数含义
lpAppName字符串将被复制到的部分的名称。 如果该部分不存在,则创建它。 部分的名称与大小写无关; 字符串可以是大写和小写字母的任意组合。
lpKeyName要与字符串关联的键的名称。 如果指定部分中不存在该键,则创建它。 如果此参数为 NULL,则删除整个部分,包括该部分中的所有条目。
lpString要写入文件的以 null 结尾的字符串。 如果此参数为 NULL,则删除 lpKeyName 参数指向的键。
lpFileName初始化文件的名称。如果文件是使用 Unicode 字符创建的,则该函数将 Unicode 字符写入文件。 否则,该函数将写入 ANSI 字符。

到此这篇关于C/C++中关于字符串的常见函数操作的文章就介绍到这了,更多相关C++字符串常见函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt项目实战之实现多文本编辑器

    Qt项目实战之实现多文本编辑器

    这篇文章主要为大家详细介绍了如何利用Qt实现简易的多文本编辑器,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • 详解_beginthreadex()创建线程

    详解_beginthreadex()创建线程

    这篇文章主要介绍了详解_beginthreadex()创建线程,使用_beginthreadex(),需要的头文件支持#include <process.h> 下面我们就来看看具体的实现吧
    2022-01-01
  • 详解c++ libuv工作队列

    详解c++ libuv工作队列

    这篇文章主要介绍了c++ libuv工作队列的相关资料,帮助大家更好的理解和使用libuv,感兴趣的朋友可以了解下
    2021-02-02
  • 解析C语言中空指针、空指针常量、NULL & 0的详解

    解析C语言中空指针、空指针常量、NULL & 0的详解

    本篇文章是对C语言中空指针、空指针常量、NULL & 0 进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • VC下实现fopen支持中文的方法

    VC下实现fopen支持中文的方法

    这篇文章主要介绍了VC下实现fopen支持中文的方法,需要的朋友可以参考下
    2014-07-07
  • Qt/C++编写视频监控系统之自定义音柱显示功能

    Qt/C++编写视频监控系统之自定义音柱显示功能

    通过音柱控件实时展示当前播放的声音产生的振幅的大小,得益于音频播放组件内置了音频振幅的计算,可以动态开启和关闭,开启后会对发送过来的要播放的声音数据,这篇文章主要介绍了Qt/C++编写视频监控系统之自定义音柱显示功能,需要的朋友可以参考下
    2024-01-01
  • 基于Qt编写全能播放组件的示例代码

    基于Qt编写全能播放组件的示例代码

    这篇文章主要为大家详细介绍了如何基于Qt编写全能播放组件,可以支持ffmpeg2/3/4/5/6/Qt4/5/6,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • C语言实现三子棋

    C语言实现三子棋

    这篇文章主要为大家详细介绍了C语言实现三子棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C语言实现汉诺塔(图文详解)

    C语言实现汉诺塔(图文详解)

    个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考。记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果。今天重新来实现一下
    2021-08-08
  • 关于STL中list容器的一些总结

    关于STL中list容器的一些总结

    list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载
    2013-09-09

最新评论