无法拆分 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 不是 ll 会给你整个字符串,而不仅仅是一个字母。

        temp = Mid(input, i, l)
        temp2 = Mid(input, i + 1, l)

此行不考虑 AZ。你应该使用 >=<=

        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)等等。