目录

一、字符串处理函数

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++标准库函数来处理字符串输入。

  1. scanf_s函数: scanf_s函数被用于从标准输入(如键盘)读取格式化输入,包括字符串。与scanf函数相比,scanf_s函数要求提供额外的参数来指定输入字符串的最大长度,以防止缓冲区溢出的安全问题。函数原型如下:

    int scanf_s(const char* format, ...);
    

    示例代码:

    char str[100];
    scanf_s("%s", str, 100);
    
  2. 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::cinstd::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 其他字符串处理函数

04-08 22:23