目录
一、字符串处理函数
1.1 输入字符串函数 scanf_s函数和get_s函数
1.2 字符串长度计算函数 strlen
1.3 字符串复制函数 strcpy_s
1.4 字符串连接函数 strcat_s
1.5 字符串比较函数 strcmp
1.6 其他字符串处理函数
一、字符串处理函数
在C++中,字符串是一串字符的序列。C++标准库提供了许多用于处理字符串的函数,可以方便地对字符串进行各种操作。
1.1 输入字符串函数 scanf_s函数和get_s函数
在C++中,scanf_s
函数和gets_s
函数是用于输入字符串的函数。然而,它们是C语言标准库函数的安全版本,C++推荐使用更为安全和强大的C++标准库函数来处理字符串输入。
-
scanf_s
函数:scanf_s
函数被用于从标准输入(如键盘)读取格式化输入,包括字符串。与scanf
函数相比,scanf_s
函数要求提供额外的参数来指定输入字符串的最大长度,以防止缓冲区溢出的安全问题。函数原型如下:int scanf_s(const char* format, ...);
示例代码:
char str[100]; scanf_s("%s", str, 100);
-
gets_s
函数:gets_s
函数用于从标准输入读取一行字符串,包括空格和制表符,并将其存储在缓冲区中。与gets
函数相比,gets_s
函数要求提供额外参数来指定输入缓冲区的大小,以防止缓冲区溢出的安全问题。函数原型如下:char* gets_s(char* str, rsize_t len);
示例代码:
char str[100]; gets_s(str, 100);
注意:
使用这些函数时,需要包含#include <cstdio>
头文件。
C++标准库提供了更好的替代函数,如std::cin
和std::getline
,它们提供了更安全和方便的方法来处理字符串输入。
例如:
#include <iostream>
#include <string>int main() {std::string str;std::cin >> str; // 读取字符串std::getline(std::cin, str); // 读取整行字符串return 0;
}
1.2 字符串长度计算函数 strlen
在C++中,可以使用标准库函数 strlen
来计算字符串的长度。strlen
函数返回一个 size_t
类型的值,表示字符串的长度,即字符串中非空字符的数量(不包括字符串末尾的空字符 \0
)。
函数原型如下:
size_t strlen(const char* str);
使用示例:
#include <iostream>
#include <cstring>int main() {const char* str = "Hello, World!";size_t len = strlen(str);std::cout << "字符串长度为: " << len << std::endl;return 0;
}
输出结果:
字符串长度为: 13
注意:
strlen
函数只能用于计算以空字符 \0
结尾的字符数组(C风格字符串)的长度。如果字符串没有以空字符结尾,那么 strlen
函数将无法正确计算长度,可能会导致程序错误。
在 C++ 中,更推荐使用 std::string
类型和其成员函数 length
来处理字符串,在不需要和 C 风格字符串进行交互的情况下更加安全和便捷。例如:
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";size_t len = str.length();std::cout << "字符串长度为: " << len << std::endl;return 0;
}
1.3 字符串复制函数 strcpy_s
strcpy_s
是 C++ 中的一个字符串复制函数,用于将一个字符串复制到另一个字符串中,包括字符串末尾的空字符 \0
。该函数是安全的,可以避免缓冲区溢出的问题。
函数原型如下:
errno_t strcpy_s(char* dest, rsize_t destSize, const char* src);
dest
:目标字符串的指针,用于存储复制后的字符串。destSize
:目标字符串dest
的大小,即缓冲区的大小。src
:源字符串的指针,要被复制的字符串。
strcpy_s
的返回值为一个 errno_t
类型的错误码,用来指示函数执行是否成功。若复制成功,则返回0;若 dest
或 src
为空指针,或者 destSize
为0,或者复制过程中存在缓冲区溢出的风险,则返回相应的错误码。
使用示例:
#include <iostream>
#include <cstring>int main() {const char* src = "Hello, World!";char dest[20];errno_t err = strcpy_s(dest, sizeof(dest), src);if (err == 0) {std::cout << "字符串复制成功:" << dest << std::endl;} else {std::cout << "字符串复制失败,错误码:" << err << std::endl;}return 0;
}
输出结果:
字符串复制成功:Hello, World!
注意:
在使用 strcpy_s
函数时,需要确保目标字符串 dest
的大小能够容纳源字符串 src
和结尾的空字符 \0
。否则,会发生缓冲区溢出,导致未定义的行为。
在 C++ 中,更推荐使用 std::string
类型和其成员函数 assign
或 operator=
来进行字符串复制,这样可以更好地避免缓冲区溢出的问题,并且更加安全和方便。例如:
#include <iostream>
#include <string>int main() {std::string src = "Hello, World!";std::string dest;dest.assign(src);std::cout << "字符串复制成功:" << dest << std::endl;return 0;
}
std::string
类型会自动管理字符串的长度和内存分配,无需手动处理缓冲区的大小,可以更好地适应 C++ 中的字符串处理。
1.4 字符串连接函数 strcat_s
strcat_s
是 C++ 中的一个字符串连接函数,用于将一个字符串连接到另一个字符串的末尾。该函数是安全的,可以避免缓冲区溢出的问题。
函数原型如下:
errno_t strcat_s(char* dest, rsize_t destSize, const char* src);
dest
:目标字符串的指针,用于存储连接后的字符串。destSize
:目标字符串dest
的大小,即缓冲区的大小。src
:源字符串的指针,要被连接到目标字符串末尾的字符串。
strcat_s
的返回值为一个 errno_t
类型的错误码,用来指示函数执行是否成功。若连接成功,则返回0;若 dest
或 src
为空指针,或者 destSize
为0,或者连接过程中存在缓冲区溢出的风险,则返回相应的错误码。
使用示例:
#include <iostream>
#include <cstring>int main() {const char* src = ", World!";char dest[20] = "Hello";errno_t err = strcat_s(dest, sizeof(dest), src);if (err == 0) {std::cout << "字符串连接成功:" << dest << std::endl;} else {std::cout << "字符串连接失败,错误码:" << err << std::endl;}return 0;
}
输出结果:
字符串连接成功:Hello, World!
注意:
在使用 strcat_s
函数时,需要确保目标字符串 dest
的大小能够容纳源字符串 src
、目标字符串 dest
和结尾的空字符 \0
。否则,会发生缓冲区溢出,导致未定义的行为。
在 C++ 中,更推荐使用 std::string
类型和其成员函数 append
或 operator+=
来进行字符串连接,这样可以更好地避免缓冲区溢出的问题,并且更加安全和方便。例如:
#include <iostream>
#include <string>int main() {std::string src = ", World!";std::string dest = "Hello";dest.append(src);std::cout << "字符串连接成功:" << dest << std::endl;return 0;
}
1.5 字符串比较函数 strcmp
strcmp
是 C++ 中的一个字符串比较函数,用于比较两个字符串的大小(字典序)。该函数比较的是字符串的字符内容,而不是字符串的内存地址。
函数原型如下:
int strcmp(const char* str1, const char* str2);
str1
:第一个待比较的字符串。str2
:第二个待比较的字符串。
strcmp
的返回值为一个整数,表示两个字符串的比较结果:
- 若
str1
小于str2
,则返回一个小于 0 的值。 - 若
str1
等于str2
,则返回 0。 - 若
str1
大于str2
,则返回一个大于 0 的值。
使用示例:
#include <iostream>
#include <cstring>int main() {const char* str1 = "abc";const char* str2 = "def";int result = strcmp(str1, str2);if (result < 0) {std::cout << "str1 小于 str2" << std::endl;} else if (result == 0) {std::cout << "str1 等于 str2" << std::endl;} else {std::cout << "str1 大于 str2" << std::endl;}return 0;
}
输出结果:
str1 小于 str2
注意:
在使用 strcmp
进行字符串比较时,需要注意两个字符串的长度和内容是否相同,以避免出现错误的比较结果。
在 C++ 中,更推荐使用 std::string
类型和其成员函数 compare
来进行字符串比较,这样可以更好地处理字符串的长度和内容,并且更加方便和安全。例如:
#include <iostream>
#include <string>int main() {std::string str1 = "abc";std::string str2 = "def";int result = str1.compare(str2);if (result < 0) {std::cout << "str1 小于 str2" << std::endl;} else if (result == 0) {std::cout << "str1 等于 str2" << std::endl;} else {std::cout << "str1 大于 str2" << std::endl;}return 0;
}
1.6 其他字符串处理函数
函数名 | 描述 |
---|---|
strncat | 连接指定长度的字符串 |
strncmp | 比较指定长度的字符串 |
strchr | 在字符串中查找指定字符 |
strrchr | 在字符串中反向查找指定字符 |
strstr | 在字符串中查找子字符串 |
strtok | 分割字符串 |
sprintf | 格式化字符串 |
atoi | 字符串转整数 |
atof | 字符串转浮点数 |
strtok_s | 安全版本的分割字符串函数 |
strcpy_s | 安全版本的复制字符串函数 |
strcat_s | 安全版本的连接字符串函数 |
sprintf_s | 安全版本的格式化字符串函数 |
wcslen | 计算宽字符串长度 |
wcscpy | 复制宽字符串 |
wcsncpy | 复制指定长度的宽字符串 |
wcscat | 连接宽字符串 |
wcsncat | 连接指定长度的宽字符串 |
wcscmp | 比较宽字符串 |
wcsncmp | 比较指定长度的宽字符串 |
wcschr | 在宽字符串中查找指定字符 |
wcsrchr | 在宽字符串中反向查找指定字符 |
wcsstr | 在宽字符串中查找子字符串 |
wcstok | 分割宽字符串 |
swprintf | 格式化宽字符串 |
_wtoi | 宽字符串转整数 |
_wtof | 宽字符串转浮点数 |
_wtoi64 | 宽字符串转64位整数 |
wcstok_s | 安全版本的分割宽字符串函数 |
wcscpy_s | 安全版本的复制宽字符串函数 |
wcscat_s | 安全版本的连接宽字符串函数 |
swprintf_s | 安全版本的格式化宽字符串函数 |
string::size | 返回字符串的大小 |
string::length | 返回字符串的长度 |
string::c_str | 返回以null结尾的字符数组 |
string::substr | 返回指定位置开始的子字符串 |
string::find | 在字符串中查找指定子字符串 |
string::rfind | 在字符串中反向查找指定子字符串 |
string::replace | 替换字符串中的子字符串 |