对 Len() 函数所得结果不准确的处理

本文介绍了一种修正VB中Len()函数在计算包含换行符文本时出现的字符计数不准确问题的方法。通过遍历文本并检测ASCII码来重新统计字符数,实现了更精确的字符计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在文字处理程序的编写中,常会遇到类似于字数统计的问题,我们在 VB/VB.NET 中使用 Len() 函数来进行字符统计,但是我们可以发现一个问题,即当我们在一个允许多行输入的文本框中输入换行符后,Len() 函数所统计出的字符数要大于文本框中的字符数,这本身并不是个错误,只不过当我们输入换行符后,在 VB 中会显示为两个字符,即 Chr(13) 和 Chr(10),这样就使得 Len() 函数所统计出的数字变大了。我们解决这个问题的方法还是有不少的,以下,我用检测 ASCII 码的方式重新统计字符.我们新建一个模块并添加以下过程:
Public Function newLen(Expression, Optional blnMsgBox As Boolean = FalseAs Long
'//(C) Wei CHEN
'
//参数 Expression 表示输入的内容
'
//参数 blnMsgBox 表示统计完成后或发生错误时是否显示对话框, False 为不显示, True 为显示

On Error GoTo ErrHandle

Dim numCache As Integer
Dim numCH As Long
Dim numLWord As Long
Dim numUWord As Long
Dim numSymbol As Long
Dim numEnter As Long
Dim numBlank As Long
Dim numNumber As Long

For i = 1 To Len(Expression)
  numCache 
= Asc(Mid$(Expression, i, 1))
  
'//Chr(10) 和 Chr(13) 可分别表示一个换行符,但如在输入过程中键入 Enter 键,则会同时输入两个字符
  If numCache = 13 Then
    
If Asc(Mid$(Expression, i + 11)) <> 10 Then numEnter = numEnter + 1
  
ElseIf numCache = 10 Then
    numEnter 
= numEnter + 1
  
ElseIf numCache >= 65 And numCache <= 90 Then '//A-Z的 ASCII 码为65-90
    numUWord = numUWord + 1
  
ElseIf numCache >= 97 And numCache <= 122 Then '//a-z的 ASCII 码为97-122
    numLWord = numLWord + 1
  
ElseIf numCache >= 48 And numCache <= 57 Then '//0-9的 ASCII 码为48-57
    numNumber = numNumber + 1
  
ElseIf numCache < 0 Then '//汉字的 ASCII 码为负数
    numCH = numCH + 1
  
ElseIf numCache = 32 Then '//空格的 ASCII 码为32
    numBlank = numBlank + 1
  
Else
    numSymbol 
= numSymbol + 1
  
End If
Next i

newLen 
= numEnter + numBlank + numNumber + numLWord + _
         numUWord 
+ numCH + numSymbol

If blnMsgBox = True Then
  
MsgBox "共有字符数(包括换行符和空格): " & newLen & " ,其中包括:" & vbNewLine & _
  
"  " & numEnter & " 个换行符;" & vbNewLine & "  " & numBlank & " 个空格;" & _
  vbNewLine 
& "  " & numNumber & " 个数字;" & vbNewLine & "  " & numLWord & _
  
" 个小写字母;" & vbNewLine & "  " & numUWord & " 个大写字母;" & vbNewLine & _
  
"  " & numCH & " 个汉字;" & vbNewLine & "  " & numSymbol & " 个符号。" & vbNewLine & _
  
"Len() 函数检测到共有字符数: " & Len(Expression) & "", vbInformation, App.Title
End If

Exit Function

ErrHandle:
  newLen 
= -1 '//发生错误时返回值为-1
  If blnMsgBox = True Then
    
MsgBox "发生以下错误,过程将结束:" & vbNewLine & vbNewLine & "  [" & Err.Number & "" & _
    Err.Description, vbApplicationModal 
+ vbCritical, "错误"
  
End If
End Function
之后,我们新建一个 标准EXE 工程,并在已创建的窗体上绘制一个文本框,命名为 txtString 并将其属性 MultiLine 属性设为 True,再绘制一个按钮,命名为 cmdCheck,并在其 cmdCheck_Click() 过程中添加如下代码:
Private Sub cmdCheck_Click()
  newLen txtString.Text, 
True
End Sub
在刚绘制的文本框中输入任意内容,便可以看到我们的函数和 Len() 函数的统计区别,同时也修正了 Len() 函数的不准确性。
### 实现用于频率测量的ACF 为了实现一个用于频率测量的自相关函数(ACF),可以遵循以下方法。这种方法利用了信号处理理论中的自相关特性,特别是对于周期性信号的应用。 #### 自相关函数简介 自相关函数衡量的是同一信号同时间点之间的相似度。具体来说,通过将两个时刻 \( t \) 和 \( t + \tau \) 的振幅相乘并对其求平均来计算自相关[^1]。这种技术特别适用于识别和分析具有周期特性的信号,因为这些信号的自相关函数也呈现出周期性特征。 #### ACF算法描述 要实现在编程环境中执行ACF运算,通常采用如下方式: - **输入数据准备**:获取待测信号的一段时间序列作为输入。 - **延迟设置**:设定同的时间滞后量 \( \tau \),以评估各个可能存在的周期成分。 - **计算互乘积**:针对每一个给定的时间滞后 \( \tau \),计算原始信号与其自身的移位版本之间对应位置上的元素乘积之和。 - **标准化处理**:对上述所得结果做适当归一化处理,使得最终输出范围位于 [-1, 1] 内。 下面是一个简单的Python代码片段展示如何基于NumPy库快速构建这样的功能: ```python import numpy as np def acf(x, max_lag=None): """ 计算离散时间序列x的最大时间为max_lag的自相关函数 参数: x (array-like): 输入的时间序列. max_lag (int or None): 考虑的最大滞后,默认为len(x)-1 返回: array: 对应于各滞后的自相关值数组 """ n = len(x) if not max_lag: max_lag = n - 1 # 中心化处理 y = x - np.mean(x) rxx = [] for lag in range(max_lag + 1): rxx.append(np.sum(y[:n-lag]*y[lag:])/(n-lag)) return np.array(rxx)/rxx[0] # 测试例子 if __name__ == "__main__": import matplotlib.pyplot as plt fs = 1e3 # Sampling frequency time = np.arange(0, 1, step=1/fs) signal = np.sin(2*np.pi*5*time)+np.random.normal(scale=.1,size=len(time)) lags = list(range(len(signal))) corr = acf(signal) fig, ax = plt.subplots() ax.plot(lags, corr) ax.set_xlabel('Lag') ax.set_ylabel('Correlation Coefficient') ax.grid(True) plt.show() ``` 这段代码实现了基本的ACF计算逻辑,并展示了如何可视化结果以便观察潜在的周期模式。值得注意的是,在实际应用中还需要考虑更多细节优化性能以及提高准确性,比如更复杂的预处理步骤、窗口加权等措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值