4.6.3 字符串(3)
该函数从旧字符串中第一个参数指定的索引位置开始,插入第二个参数指定的字符串。操作结果是如下所示的新字符串:
- Many deck hands make light work.
我们还可以用另一个字符代替字符串中给定字符的所有实例,或者用另一个子串代替给定子串的所有实例。下面的代码段给出了这两种用法:
- String^ proverb = L"Many hands make light work.";
- Console::WriteLine(proverb->Replace(L' ', L'*');
- Console::WriteLine(proverb->Replace(L"Many hands", L"Pressing switch");
执行该代码段将产生下面的输出:
- Many*hands*make*light*work.
- Pressing switch make light work.
Replace()函数的第一个参数指定要被替换的字符或子串,第二个参数指定替换者。
3. 比较字符串
我们可以在String类中用Compare()函数比较两个String对象。该函数返回一个整数,根据第一个参数是小于、等于还是大于第二个参数,返回值将小于0、等于0或大于0。举例如下:
- String^ him(L"Jacko");
- String^ her(L"Jillo");
- int result = String::Compare(him, her);
- if(result < 0)
- Console::WriteLine(L"{0} is less than {1}.", him, her);
- else if(result > 0)
- Console::WriteLine(L"{0} is greater than {1}.", him, her);
- else
- Console::WriteLine(L"{0} is equal to {1}.", him, her);
我们将Compare()函数返回的值存储在result中,并在if语句中用它来决定适当的输出。执行上面这段代码会产生如下输出:
- Jacko is less than Jillo.
Compare()的另一个版本需要第三个参数,类型为bool。如果第三个参数为true,那么比较前两个参数引用的字符串时就忽略大小写;如果第三个参数为false,那么比较行为就与前面的Compare()版本相同。
4. 搜索字符串
最简单的搜索操作是测试某个字符串是否以给定的子串开始或结束。StartsWith()和EndsWith()函数可完成这项任务。我们必须给函数提供要寻找的子串的句柄,以作为该函数的参数,函数返回一个bool值来指出该子串是否存在。下面的代码段示范了StartsWith()函数的用法:
- String^ sentence = L"Hide, the cow's outside.";
- if(sentence->StartsWith(L"Hide"))
- Console::WriteLine(L"The sentence starts with 'Hide'.");
执行该代码段产生的输出如下:
- The sentence starts with 'Hide'.
当然,我们还可以对sentence字符串应用EndsWith()函数:
- Console::WriteLine(L"The sentence does{0} end with 'outside'.",
- sentence->EndsWith(L"outside") L"" : L" not");
我们将条件表达式的结果插入到输出字符串中。如果EndsWith()返回true,则结果为空字符串;如果返回false,则结果为" not"。在这个实例中,EndsWith()函数将返回false(由于sentence字符串最后有一个句点)。
IndexOf()函数搜索给定字符或子串在字符串中第一次出现时的字符位置,并当搜索成功时返回相应的索引值,或者在失败时返回-1。我们必须将要寻找的字符或子串指定为该函数的参数。例如:
- String^ sentence = L"Hide, the cow's outside.";
- int ePosition = sentence->IndexOf(L'e'); // Returns 3
- int thePosition = sentence->IndexOf(L"the"); // Returns 6
第一次是搜索字母'e',第二次是搜索单词"the"。注释指出了IndexOf()函数将返回的数值。
更典型的情况是需要找出给定字符或子串在字符串中出现的所有字符位置,IndexOf()函数的另一个版本被设计成能够重复使用,从而使我们达到前述目的。这种情况下,我们要提供第二个参数来指定搜索开始的索引位置。下面是以这种方式使用该函数的示例:
- int index = 0;
- int count = 0;
- while((index = words->IndexOf(word,index)) >= 0)
- {
- index += word->Length;
- ++count;
- }
- Console::WriteLine(L"'{0}' was found {1}
times in:\n{2}", word, count, words);
该代码段计算words字符串中"wool"的出现次数。搜索操作是在while循环中进行的,结果存储在index中。只要index是非负数,该循环就继续执行,因此当IndexOf()返回-1时,循环结束。在循环体内部,index的值与word的长度相加,使索引位置移至找到的word实例后面的那个字符,从而为下次搜索作好准备。count变量在循环中加1,因此当循环结束时,该变量的值就是words中word所出现的总次数。执行该代码段产生的输出如下:
- 'wool' was found 5 times in:
- wool wool sheep sheep wool wool wool
LastIndexOf()函数类似于IndexOf()函数,只不过该函数是从尾部或指定的索引位置往回搜索字符串。下面给出如何用LastIndexOf()函数执行前述操作的示例:
- int index = words->Length - 1;
- int count = 0;
- while(index >= 0 && (index = words->LastIndexOf(word,index)) >= 0)
- {
- --index;
- ++count;
- }