本篇内容介绍了“C/C++中关于字符串的常见函数操作方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
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:将设置格式的数据写入字符串。定义在头文件<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.732053character count = 53
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:将 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:将 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:返回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不是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不是C/C++中标准库函数,而是windows
的一个接口。定义在libloaderapi.h
头文件中。检索指定模块的模块句柄。该模块必须已由调用进程加载。
HMODULE GetModuleHandleW( [in, optional] LPCWSTR lpModuleName );
lpModuleName
:加载的模块的名称(.dll或.exe文件)。如果省略文件扩展名,则会追加默认的库扩展名.dll。文件名字符串可以包含尾随点字符 (.),以指示模块名称没有扩展名。该字符串不必指定路径。指定路径时,请确保使用反斜杠 (\),而不是正斜杠 (/)。该名称将与当前映射到调用进程的地址空间的模块的名称进行比较(大小写独立)。
如果此参数为 NULL,则 GetModuleHandle 将返回用于创建调用进程的文件的句柄(.exe文件)。
以下几个函数是Rpcrt4.dll
动态库中的。
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:比较两个 UUID并确定它们的顺序。返回值给出顺序。
signed int UuidCompare( UUID *Uuid1, UUID *Uuid2, RPC_STATUS *Status );
参数 | 说明 |
---|---|
Uuid1 | 指向 UUID 的指针 |
Uuid2 | 指向 UUID 的指针 |
Status | 返回可能发生的任何错误,并且通常由函数设置为在返回时RPC_S_OK |
返回值 | 意义 |
---|---|
–1 | Uuid1 参数小于 Uuid2 参数 |
0 | Uuid1 参数等于 Uuid2 参数 |
1 | Uuid1 参数大于 Uuid2 参数 |
UuidHash:应用程序调用 UuidHash
函数为指定的 UUID
生成哈希值。
unsigned short UuidHash( UUID *Uuid, RPC_STATUS *Status );
参数 | 说明 |
---|---|
Uuid | 为其创建哈希值的 UUID |
Status | 返回RPC_S_OK |
UuidCreate:创建一个新的 UUID
RPC_STATUS UuidCreate( UUID *Uuid );
Uuid
:返回指向创建的 UUID
的指针
返回值 | 意义 |
---|---|
RPC_S_OK | 调用成功 |
RPC_S_UUID_LOCAL_ONLYUUID | 保证仅对此计算机是唯一的 |
RPC_S_UUID_NO_ADDRESS | 无法获取此计算机的以太网或令牌环硬件地址 |
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:将宽字符序列转换为相应的多字节字符序列。
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 | 转换后的多字节字符串的缓冲区地址。 |
sizeInBytes | mbstr 缓冲区的大小(以字节为单位)。 |
wcstr | 指向要转换的宽字符串。 |
count | 要存储在 mbstr 缓冲区中的最大字节数,不包括终止空字符或 _TRUNCATE 。 |
locale | 要使用的语言环境 |
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++中关于字符串的常见函数操作方法有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。