无法拆分 PascalCase 字符串并将其存储在 VB 中的数组中
Having trouble splitting a PascalCase string and storing it in an array in VB
CorrectHorseBatteryStaple
到
Correct
Horse
Battery
Staple
(Empty)
还有一个问题,我不能使用 类,函数,除了 Mid()、Right()、Left()、Len()、Asc() 之外的内置函数。这让整个事情变得更加困难。
我这辈子都想不出如何比较字符串中的字符并以某种方式停止 loop/store 数组中的第一个单词等等。
这是我到目前为止所做的,没有任何意义:
Sub Main()
Dim input As String
Dim str(5) As String
Dim tempstr As String
Dim temp As Char
Dim temp2 As Char
Dim l As Integer
Console.WriteLine("Enter the string: ")
input = Console.ReadLine()
l = Len(input)
For z As Integer = 1 To 5
For i As Integer = 1 To l
temp = Mid(input, i, l)
temp2 = Mid(input, i + 1, l)
If Asc(temp) > 65 And Asc(temp) < 90 Then
tempstr = temp
If Asc(temp2) > 65 And Asc(temp2) < 90 Then
tempstr = temp
Else
tempstr = tempstr & temp
End If
Else
tempstr = tempstr & temp
End If
Next i
str(z) = tempstr
Next z
For a As Integer = 1 To 5
Console.WriteLine(str(a))
Next a
Console.ReadKey()
End Sub
很明显,你还没有把代码干运行。它充满了错误,因此它永远不会 运行 按预期进行。
Dim str(5) As String
For z As Integer = 1 To 5 ' will never run for over 5 words
在下一行中,我认为您打算使用 Mid(input, i , 1)
。 1
不是 l
。 l
会给你整个字符串,而不仅仅是一个字母。
temp = Mid(input, i, l)
temp2 = Mid(input, i + 1, l)
此行不考虑 A
和 Z
。你应该使用 >=
和 <=
If Asc(temp) >= 65 And Asc(temp) <= 90 Then
这一行将return最后一个字符出现错误或空字符串
temp2 = Mid(input, i + 1, l)
这一行不考虑数组中的第一个元素
For a As Integer = 1 To 5
Console.WriteLine(str(a))
Next a
看起来您受限于使用本机 VB6 函数的要求,尽管 VB.net 的功能可以帮助您以更少的行数更清晰地编写此代码。
下面的代码,再次限制在 5 个字内,应该会为您提供所需的输出:
Sub Main()
Dim input As String
Dim str(5) As String
Dim tempstr As String
Dim temp As Char
Dim temp2 As Char
Dim l As Integer
Dim arrCounnter As Integer
Console.WriteLine("Enter the string: ")
input = Console.ReadLine()
tempstr = ""
l = Len(input)
For i As Integer = 1 To l
temp = Mid(input, i, 1)
'If capital, add to new temp; put old temp in array
If Asc(temp) >= 65 And Asc(temp) <= 90 Then
If tempstr <> "" Then
str(arrCounnter) = tempstr
arrCounnter = arrCounnter + 1
End If
tempstr = temp
Else
'If not, add to old temp, nxt
tempstr = tempstr & temp
End If
If i = l Then str(arrCounnter) = tempstr
Next i
For a As Integer = 0 To 5
If str(a) = "" Then
Console.WriteLine("(Empty)")
Else
Console.WriteLine(str(a))
End If
Next a
Console.ReadKey()
End Sub
在开始之前,我建议您使用列表而不是数组。这样,如果你想拆分更多的单词,你就不需要更改代码。但是,我猜你还没有涵盖这些。所以...
最简单的方法是遍历数组中的每个字符,如果字符是大写字母,则转到下一个数组项并将该字符添加到数组项中。如果字符是小写的,那么只需将它添加到当前数组项中。这样就不需要用那么多变量了。
这里假设首字母大写。如果没有,将会有
Index out of range
错误。
给你..
Module module1
Sub Main()
Dim input As String
Dim str(3) As String
Dim temp As String
Dim l As Integer
Dim z As Integer = -1 ' array index
Console.WriteLine("Enter the string: ")
input = Console.ReadLine()
l = Len(input)
For i As Integer = 1 To l
temp = Mid(input, i, 1)
'if temp is a capital letter increase the array index by 1 and add temp to that array item
If (Asc(temp) >= 65 And Asc(temp) <= 90) Then
z = z + 1
str(z) = str(z) & temp
End If
' if the temp is lower case then just add temp to the current array item
If (Asc(temp) >= 97 And Asc(temp) <= 122) Then
str(z) = str(z) & temp
End If
Next
Console.WriteLine()
For a As Integer = 0 To 3
Console.WriteLine(str(a))
Next a
Console.ReadKey()
End Sub
End Module
我应该解释一下为什么 Z 以 -1 开头。这是基于输入字符串的第一个字母是大写的假设。
当你第一次执行循环时,temp
中存储的第一个字符是大写的,第一个 If
语句的内容被执行,所以加 1到 z 使得 z=0。然后将这个大写的第一个字母添加到数组的第一个元素 str(0) 中。
当您继续循环时,后续的小写字母只会添加到 str(0)。
当循环到达下一个大写字母时,再次将1添加到z
以便z=1并将大写字母添加到z(1)等等。
CorrectHorseBatteryStaple
到
Correct
Horse
Battery
Staple
(Empty)
还有一个问题,我不能使用 类,函数,除了 Mid()、Right()、Left()、Len()、Asc() 之外的内置函数。这让整个事情变得更加困难。
我这辈子都想不出如何比较字符串中的字符并以某种方式停止 loop/store 数组中的第一个单词等等。
这是我到目前为止所做的,没有任何意义:
Sub Main()
Dim input As String
Dim str(5) As String
Dim tempstr As String
Dim temp As Char
Dim temp2 As Char
Dim l As Integer
Console.WriteLine("Enter the string: ")
input = Console.ReadLine()
l = Len(input)
For z As Integer = 1 To 5
For i As Integer = 1 To l
temp = Mid(input, i, l)
temp2 = Mid(input, i + 1, l)
If Asc(temp) > 65 And Asc(temp) < 90 Then
tempstr = temp
If Asc(temp2) > 65 And Asc(temp2) < 90 Then
tempstr = temp
Else
tempstr = tempstr & temp
End If
Else
tempstr = tempstr & temp
End If
Next i
str(z) = tempstr
Next z
For a As Integer = 1 To 5
Console.WriteLine(str(a))
Next a
Console.ReadKey()
End Sub
很明显,你还没有把代码干运行。它充满了错误,因此它永远不会 运行 按预期进行。
Dim str(5) As String
For z As Integer = 1 To 5 ' will never run for over 5 words
在下一行中,我认为您打算使用 Mid(input, i , 1)
。 1
不是 l
。 l
会给你整个字符串,而不仅仅是一个字母。
temp = Mid(input, i, l)
temp2 = Mid(input, i + 1, l)
此行不考虑 A
和 Z
。你应该使用 >=
和 <=
If Asc(temp) >= 65 And Asc(temp) <= 90 Then
这一行将return最后一个字符出现错误或空字符串
temp2 = Mid(input, i + 1, l)
这一行不考虑数组中的第一个元素
For a As Integer = 1 To 5
Console.WriteLine(str(a))
Next a
看起来您受限于使用本机 VB6 函数的要求,尽管 VB.net 的功能可以帮助您以更少的行数更清晰地编写此代码。
下面的代码,再次限制在 5 个字内,应该会为您提供所需的输出:
Sub Main()
Dim input As String
Dim str(5) As String
Dim tempstr As String
Dim temp As Char
Dim temp2 As Char
Dim l As Integer
Dim arrCounnter As Integer
Console.WriteLine("Enter the string: ")
input = Console.ReadLine()
tempstr = ""
l = Len(input)
For i As Integer = 1 To l
temp = Mid(input, i, 1)
'If capital, add to new temp; put old temp in array
If Asc(temp) >= 65 And Asc(temp) <= 90 Then
If tempstr <> "" Then
str(arrCounnter) = tempstr
arrCounnter = arrCounnter + 1
End If
tempstr = temp
Else
'If not, add to old temp, nxt
tempstr = tempstr & temp
End If
If i = l Then str(arrCounnter) = tempstr
Next i
For a As Integer = 0 To 5
If str(a) = "" Then
Console.WriteLine("(Empty)")
Else
Console.WriteLine(str(a))
End If
Next a
Console.ReadKey()
End Sub
在开始之前,我建议您使用列表而不是数组。这样,如果你想拆分更多的单词,你就不需要更改代码。但是,我猜你还没有涵盖这些。所以...
最简单的方法是遍历数组中的每个字符,如果字符是大写字母,则转到下一个数组项并将该字符添加到数组项中。如果字符是小写的,那么只需将它添加到当前数组项中。这样就不需要用那么多变量了。
这里假设首字母大写。如果没有,将会有
Index out of range
错误。
给你..
Module module1
Sub Main()
Dim input As String
Dim str(3) As String
Dim temp As String
Dim l As Integer
Dim z As Integer = -1 ' array index
Console.WriteLine("Enter the string: ")
input = Console.ReadLine()
l = Len(input)
For i As Integer = 1 To l
temp = Mid(input, i, 1)
'if temp is a capital letter increase the array index by 1 and add temp to that array item
If (Asc(temp) >= 65 And Asc(temp) <= 90) Then
z = z + 1
str(z) = str(z) & temp
End If
' if the temp is lower case then just add temp to the current array item
If (Asc(temp) >= 97 And Asc(temp) <= 122) Then
str(z) = str(z) & temp
End If
Next
Console.WriteLine()
For a As Integer = 0 To 3
Console.WriteLine(str(a))
Next a
Console.ReadKey()
End Sub
End Module
我应该解释一下为什么 Z 以 -1 开头。这是基于输入字符串的第一个字母是大写的假设。
当你第一次执行循环时,temp
中存储的第一个字符是大写的,第一个 If
语句的内容被执行,所以加 1到 z 使得 z=0。然后将这个大写的第一个字母添加到数组的第一个元素 str(0) 中。
当您继续循环时,后续的小写字母只会添加到 str(0)。
当循环到达下一个大写字母时,再次将1添加到z
以便z=1并将大写字母添加到z(1)等等。