4.6.3 字符串(2)
示例说明
本程序的目的是创建一个格式字符串,用足以容纳最长整数字符串的宽度,按列对齐数组中整数的输出。我们最初分两部分来创建该格式字符串:
- String^ formatStr1 = L"{0,"; // 1st half of format string
- String^ formatStr2 = L"}"; // 2nd half of format string
这两个字符串是最终所需格式字符串的头部和尾部。我们需要算出最长数值字符串的长度,并将其夹在formatStr1和formatStr2之间,以形成完整的格式字符串。
我们用下面的代码寻找所需的长度:
- int maxLength = 0; // Holds the maximum length found
- for each(int value in values)
- {
- number = "" + value; // Create string from value
- if(maxLength<number->Length)
- max Length = number->Length;
- }
在这个循环中,通过将数组中的每一个数与空字符串连接,我们将其转换为String表示法。我们将各个字符串的Length属性与maxLength进行比较,如果该属性大于maxLength的当前值,则将其作为新的最大长度。
创建格式字符串非常简单:
- String^ format = formatStr1 + (maxLength+1) + formatStr2;
我们需要给maxLength加1,以便在显示最大长度字符串时字段中还能多出一个空格。将表达式maxLength+1放入括弧之间,可以确保在执行字符串连接操作之前先执行算术运算。
最后,我们在下面的代码中使用format字符串,以输出数组中的数值:
- int numberPerLine = 3;
- for(int i = 0 ; i< values->Length ; i++)
- {
- Console::Write(format, values[i]);
- if((i+1)%numberPerLine == 0)
- Console::WriteLine();
- }
该循环中的输出语句使用format作为输出字符串。由于maxLength已经插入到format字符串中,所以输出字段比最长的输出值宽一个字符。numberPerLine变量决定着每行显示多少个数值,因此我们可以通过修改numberPerLine的值而改变列数,从这方面来说该循环是非常通用的。
2. 修改字符串
就修改字符串而言,最普通的要求是删除头部和尾部的空格。String对象的Trim()函数可以完成这项任务:
- String^ str = {L" Handsome is as handsome does... "};
- String^ newStr = str->Trim();
第二条语句中的Trim()函数将删除str头部和尾部的所有空格,并将返回的新String对象存储在newStr中。当然,如果我们不想保留原来的字符串,则可以将结果还存储在str中。
Trim()函数的另一个版本允许我们指定从字符串的头部和尾部删除的字符。该函数非常灵活,因为我们有多种指定被删除字符的方法。我们可以先在数组中指定一些字符,然后将该数组的句柄传递给Trim()函数作为参数:
- String^ toBeTrimmed = L"wool wool sheep sheep wool wool wool";
- array<wchar_t>^ notWanted = {L'w',L'o',L'l',L' '};
- Console::WriteLine(toBeTrimmed->Trim(notWanted));
希望从toBeTrimmed字符串中删除的字符是在notWanted数组中定义的,因此将该数组的句柄传递给toBeTrimmed字符串的Trim()函数,将从字符串头部和尾部删除任何该数组包含的字符。记住,String对象是固定不变的,因此原来的字符串在任何方式下都不会发生改变-- 新字符串的创建和返回都是通过Trim()函数实现的。执行该代码段产生的输出如下:
- sheep sheep
如果在指定字符字面值时没有加前缀L,则这些字符将是char类型(对应于SByte数值类类型);不过,编译器将把它们转换为wchar_t类型。
我们还可以在Trim()函数的参数中显式指定要删除的字符,因此前面代码段的最后一行可以写成:
- Console::WriteLine(toBeTrimmed->Trim(L'w', L'o', L'l', L' '));
这条语句产生与前面相同的输出。我们可以指定任意多个wchar_t类型的参数,但如果有大量字符,最好的方法还是使用数组。
如果我们只想修改字符串的一端,则可以使用TrimEnd()或TrimStart()函数。这两个函数是Trim()的变体版本,如果不带任何参数,则删除空格;以数组作为参数,则删除在数组中指定的字符;如果使用显式的wchar_t参数,则删除这些字符。
反过来,我们也可以在字符串的任一端填充空格或其他字符。可以使用PadLeft()和PadRight()函数分别在字符串的左边或右边填充字符。这两个函数的主要用途是需要在宽度固定的字段中靠左或靠右对齐字符串时格式化输出。更简单的PadLeft()和PadRight()函数版本接受一个指定结果字符串长度的参数。例如:
- String^ value = L"3.142";
- String^ leftPadded = value->PadLeft(10); // Result is L" 3.142"
- String^ rightPadded = value->PadRight(10); // Result is L"3.142 "
如果参数指定的长度小于或等于原来字符串的长度,则这两个函数将返回一个与原来字符串相同的新String对象。
为了用字符而非空格填充字符串,需要指定填充字符作为PadLeft()或PadRight()函数的第二个参数。下面是两个示例:
- String^ value = L"3.142";
- String^ leftPadded = value->PadLeft(10, L'*');
// Result is L"*****3.142" - String^ rightPadded = value->PadRight(10, L'#');
// Result is L"3.142#####"
当然,在所有这些示例中,我们都可以将结果还存储在引用原来字符串的句柄中,这样将抛弃原来的字符串。
String类还有将整个字符串转换为大写或小写字母的ToUpper()和ToLower()函数,其用法如下:
- String^ proverb = L"Many hands make light work.";
- String^ upper = proverb->ToUpper(); // Result
L"MANY HANDS MAKE LIGHT WORK."
ToUpper()函数返回的新字符串是转换为大写字母的原始字符串。
我们使用Insert()函数,可以在现有字符串的给定位置插入一个字符串。下面是一个示例:
- String^ proverb = L"Many hands make light work.";
- String^ newProverb = proverb->Insert(5, L"deck ");