学习C++语言的starts_with()

530 阅读3分钟

有一段时间,程序员必须知道一个字符串以什么开头。这种知识可以用来选择或消除字符列表中的项目。因此,程序员可能想知道一个字符串是否以一个特定的字符或一个特定的子字符串开始。程序员可以编写代码,逐一检查字符串的初始字符,并将其与前缀子串进行比较。然而,所有涉及的策略都已经由C++字符串库完成了。

C++字符串库的字符串类有一个成员函数,starts_with()。这为程序员完成了工作,但程序员需要知道如何使用这个函数。而这正是制作本教程的原因。string starts_with()成员函数有三种变体。同一函数的变体被称为重载函数。

start_with()成员函数的基本方法是将一个独立的短子串与有关字符串的第一个短段进行比较。如果它们是相同的,那么该函数返回true。如果它们不同,则函数返回false。

请注意:starts_with()成员函数是C++20的一个特性。在这篇文章中,我们是在2021年的今天,所以你的编译器可能无法成功编译代码样本。

文章内容

bool starts_with(charT x) const

这个成员函数检查字符串字头是否以一个特定的字符开始。请记住,字符串字头必须是由字符串类实例化的对象。下面的程序检查字符串是否以大写的'W'开头。

#include <iostream>

#include <string>

using namespace std;

   
int main()

{

    basic_string str = "We are moving on.";

     
    bool bl = str.starts_with('W');

    cout <<bl <<endl;

 
    return 0;

}

输出应该是1,表示真。

匹配是区分大小写的。所以下面程序的输出应该是假的。

#include <iostream>

#include <string>

using namespace std;

   
int main()

{

    basic_string<char> str = "We are moving on.";

     
    bool bl = str.starts_with('w');

    cout <<bl <<endl;

 
    return 0;

}

输出的结果应该是0,表示错误。

一个字符串也可以以非字母字符开始。下面的程序检查字符串是否以'['开头。

#include <iostream>

#include <string>

using namespace std;

   
int main()

{

    basic_string<char>str = "[Note: Note information - - -. — end note]";

   
    bool bl = str.starts_with('[');

    cout <<bl <<endl;

 
    return 0;

}

输出应该是1,为真

bool starts_with(const charT* x) const

程序员可能想知道一个感兴趣的字符串是否以一个特定的独立子串开始。在这种情况下,他必须使用这个成员函数。下面的程序说明了这一点。

#include <iostream>

#include <string>

using namespace std;

   
int main()

{

    basic_string str = "We are moving on.";

    const char* ss = "We are";

     
    bool bl = str.starts_with(ss);

    cout <<bl <<endl;

 
    return 0;

}

输出的结果应该是1为真。

匹配是区分大小写的。所以下面这个程序的输出应该是false,其中独立的子串有一个以上的字符。

#include <iostream>

#include <string>

using namespace std;

   
int main()

{

    basic_string<char> str = "We are moving on.";

    const char* ss = "WE ARE";

     
    bool bl = str.starts_with(ss);

    cout <<bl <<endl;

 
    return 0;

}

输出的结果应该是0,表示错误。

字符串也可以以非字母字符开始。下面的程序检查字符串是否以某个特定的数字子串开始。

#include <iostream>

#include <string>

using namespace std;

   
int main()

{

    basic_string<char>str = "8762HT is a code number.";

    const char* ss = "8762";

     
    bool bl = str.starts_with(ss);

    cout <<bl <<endl;

 
    return 0;

}

输出应该是1,表示真。

bool starts_with(basic_string_view x) const

字符串视图

starts_with成员函数的参数可以是一个string_view对象。接下来的问题是,"什么是string_view?"。string_view是某个原始字符串的一个范围,它成为一个新的字符串对象的列表。这些字符不是从原始字符串中复制出来的;它们是被引用的。也就是说,原始字符串的元素没有被复制;它们被引用了。然而,这个string-view具有string类所具有的许多功能。string_view也是一个类,从这个类中可以创建string_view对象。下面的程序显示了string_view类和字符串的相似性。

#include <iostream>

#include <string_view>

using namespace std;

   
int main()

{

    const char* str = "Everything that goes up must come down.";

    string_view strV(str, 23);


    for (int i=0; i <strV.size(); i++)

        cout <<strV[i];

    cout <<endl;


    return 0;

}

输出的结果是。

Everything that goes up

必须要包含string_view库。注意,在声明中,使用了string_view而不是basic_string_view。原始字符串的前23个字符成为string_view的字符。构建string_view对象的程序语句是。

string_view strV(str, 23);

如果原始字符串范围内的某个字符被改变,那么字符串视图也会被改变。下面的程序说明了这一点。

#include <iostream>

#include <string_view>

using namespace std;

   
int main()

{

    char str[] = "Everything that goes up must come down.";

    string_view strV(str, 23);

    str[1] = 'a'; str[2] = 'r';  str[3] = 'l';


    for (int i=0; i <strV.size(); i++)

        cout <<strV[i];

    cout <<endl;


    return 0;

}

输出的结果是。

Earlything that goes up

在string_view对象被声明后,原始字符串的第一、第二和第三个字符被改变。这证实了虽然string_view是一个对象,但它引用了原始字符串中的一个范围,而没有这个范围的副本。

原始字符串的文本可以成为常量。为了实现这一点,使用一个指向char的常量指针,而不是一个array-of-chars。下面的程序不能编译,发出错误信息,因为原始字符串的文本已经变成常量了。

#include <iostream>

#include <string_view>

using namespace std;

   
int main()

{

    const char* str = "Everything that goes up must come down.";

    string_view strV(str, 23);

    str[1] = 'a'; str[2] = 'r';  str[3] = 'l';


    for (int i=0; i <strV.size(); i++)

        cout <<strV[i];

    cout <<endl;


    return 0;

}

字符串视图参数

string_starts()函数的语法是。

bool starts_with(basic_string_view<charT, traits>x) const

上面已经说明了如何创建一个string_view对象。创建对象后,将其作为参数传给start_with()字符串成员函数。下面的程序说明了这一点。

#include <iostream>

#include <string_view>

#include <string>

using namespace std;

   
int main()

{

    const char* str = "Everything that goes up must come down.";

    string_view strV(str, 23);


    const char* ss = "Everything";


    bool bl = str.starts_with(ss);


    cout <<bl <<endl;


    return 0;

}

输出应该是真,为1。这一次,string和string_view库已经被包括在内。

如果程序员想改变原来的字符串,他必须使用一个ars数组作为string_view构造函数的参数,而不是一个char的常数指针。下面的程序显示了这种情况,即原始字符串将如何被改变。

#include <iostream>

#include <string_view>

#include <string>

using namespace std;

   
int main()

{

    char str[] = "Everything that goes up must come down.";

    string_view strV(str, 23);

    str[5] = 'a'; str[6] = 'r';  str[7] = 'l'; str[8] = 'r';  str[9] = 'l';


    const char* ss = "Everyapple";


    bool bl = str.starts_with(ss);


    cout <<bl <<endl;


    return 0;

}

输出应该是1,表示真。

即使start_with()成员函数的参数是一个string_view对象,仍然会尊重其大小写。下面的程序说明了这一点。

#include <iostream>

#include <string_view>

#include <string>

using namespace std;

   
int main()

{

    char str[] = "Everything that goes up must come down.";

    string_view strV(str, 23);


    const char* ss = "everything";


    bool bl = str.starts_with(ss);


    cout <<bl <<endl;


    return 0;

}

输出的结果应该是0,表示错误。子字符串中的第一个'e'是小写的,而感兴趣的字符串中的第一个'E'是大写的。

如果start_with()成员函数的参数是一个string_view,那么非字母字符仍然可以成为字符串的一部分。在下面的程序中,一组连续的整数字符被检查是否开始了感兴趣的字符串,其中start_with()参数是一个string_view。

#include <iostream>

#include <string_view>

#include <string>

using namespace std;

   
int main()

{

    const char* str = "8762HT is a code number.";

    string_view strV(str);


    const char* ss = "8762";


    bool bl = str.starts_with(ss);


    cout <<bl <<endl;


    return 0;

}

输出的结果应该是1为真。

结论

C++中的字符串类有一个名为start_with()的成员函数。它检查一个子独立的字符串,是否构成一个感兴趣的字符串(前缀)的第一个字符。重载的成员函数是 starts_with(charT x), starts_with(const charT* x), 和 starts_with(string_view x)。每个函数都返回一个bool。