by 水波形 » 2014年6月11日(水) 12:39
お世話になっております。
文字列を置換する関数を探していたのですが、どうしても見つからず自作しています。
以下の様なコードを書いているのですが、最後の方の
buffer = realloc(buffer,lstrlen(buffer) + lstrlen(SubText) + 1)
で、再確保するときにエラーが出ます。
具体的な内容として、
置換対象文字列<置換後文字列の時、メモリ不足と言われます。
デバッグモードで実行していると、bufferのポインタが0になっていました。
何かお気づきの点がございましたら、ご教授いただけると幸いです。
一応関数の説明も記載しておきます。
・BaseData As BytePtr:置換対象の文章データを入れます。
・SearchText As BytePtr:検索する文字列(置換される文字列?)を入れます。
・SubText As BytePtr:置換後の文字列を入れます。
例
BaseData:女の子『今日もいい天気だね』
SearchText:女の子『
SubText:女の子の名前「
↓
女の子の名前「今日もいい天気だね』
コード: 全て選択
Function SubstitutionText(BaseData As BytePtr,SearchText As BytePtr,SubText As BytePtr) As BytePtr
Dim StartPos As Long
Dim EndPos As Long
Dim Text As String
Dim buffer As BytePtr
Dim Length As Long
StartPos = 1
EndPos = 1
buffer = NULL
Do
'debug
StartPos = InStr(StartPos,BaseData,MakeStr(SearchText))
'開始文字がなければループを抜ける
If StartPos <= 0 Then
Text = Mid$(MakeStr(BaseData),EndPos)
If buffer = NULL Then
buffer = malloc(lstrlen(buffer)+lstrlen(Text) + 1)
lstrcpy(buffer,Text)
Else
realloc(buffer,lstrlen(buffer)+lstrlen(Text) + 1)
lstrcat(buffer,Text)
End If
Exit Do
End If
'スタートポジションまでを変数に格納
If StartPos = EndPos Then
'すぐに次の置換対象文字があった場合
Text = Mid$(MakeStr(BaseData),StartPos,lstrlen(SubText))
StartPos = StartPos + lstrlen(SubText)
Else
Text = Mid$(MakeStr(BaseData),EndPos,StartPos - EndPos)
End If
If buffer = NULL Then
buffer = malloc(StartPos)
lstrcpy(buffer,Text)
Else
buffer = realloc(buffer,StartPos)
lstrcat(buffer,Text)
End If
'置換処理
'd("Allbuffer:"+Str$(lstrlen(buffer) + lstrlen(SubText) + 1)+Ex"\r\nbuffer:"+Str$(lstrlen(buffer))+Ex"\r\nSubText:"+Str$(lstrlen(SubText))+Ex"\r\nSubText:"+MakeStr(SubText)+Ex"\r\nbuffer:"+MakeStr(buffer))
buffer = realloc(buffer,lstrlen(buffer) + lstrlen(SubText) + 1)
lstrcat(buffer,SubText)
'終了ポジションを確定
EndPos = StartPos + lstrlen(SearchText)
'スタートポジションを進める
StartPos = StartPos + lstrlen(SearchText)
Loop
SubstitutionText = buffer
End Function
お世話になっております。
文字列を置換する関数を探していたのですが、どうしても見つからず自作しています。
以下の様なコードを書いているのですが、最後の方の
buffer = realloc(buffer,lstrlen(buffer) + lstrlen(SubText) + 1)
で、再確保するときにエラーが出ます。
具体的な内容として、
[b]置換対象文字列<置換後文字列の時[/b]、メモリ不足と言われます。
デバッグモードで実行していると、bufferのポインタが0になっていました。
何かお気づきの点がございましたら、ご教授いただけると幸いです。
一応関数の説明も記載しておきます。
・BaseData As BytePtr:置換対象の文章データを入れます。
・SearchText As BytePtr:検索する文字列(置換される文字列?)を入れます。
・SubText As BytePtr:置換後の文字列を入れます。
例
BaseData:女の子『今日もいい天気だね』
SearchText:女の子『
SubText:女の子の名前「
↓
女の子の名前「今日もいい天気だね』
[code]Function SubstitutionText(BaseData As BytePtr,SearchText As BytePtr,SubText As BytePtr) As BytePtr
Dim StartPos As Long
Dim EndPos As Long
Dim Text As String
Dim buffer As BytePtr
Dim Length As Long
StartPos = 1
EndPos = 1
buffer = NULL
Do
'debug
StartPos = InStr(StartPos,BaseData,MakeStr(SearchText))
'開始文字がなければループを抜ける
If StartPos <= 0 Then
Text = Mid$(MakeStr(BaseData),EndPos)
If buffer = NULL Then
buffer = malloc(lstrlen(buffer)+lstrlen(Text) + 1)
lstrcpy(buffer,Text)
Else
realloc(buffer,lstrlen(buffer)+lstrlen(Text) + 1)
lstrcat(buffer,Text)
End If
Exit Do
End If
'スタートポジションまでを変数に格納
If StartPos = EndPos Then
'すぐに次の置換対象文字があった場合
Text = Mid$(MakeStr(BaseData),StartPos,lstrlen(SubText))
StartPos = StartPos + lstrlen(SubText)
Else
Text = Mid$(MakeStr(BaseData),EndPos,StartPos - EndPos)
End If
If buffer = NULL Then
buffer = malloc(StartPos)
lstrcpy(buffer,Text)
Else
buffer = realloc(buffer,StartPos)
lstrcat(buffer,Text)
End If
'置換処理
'd("Allbuffer:"+Str$(lstrlen(buffer) + lstrlen(SubText) + 1)+Ex"\r\nbuffer:"+Str$(lstrlen(buffer))+Ex"\r\nSubText:"+Str$(lstrlen(SubText))+Ex"\r\nSubText:"+MakeStr(SubText)+Ex"\r\nbuffer:"+MakeStr(buffer))
buffer = realloc(buffer,lstrlen(buffer) + lstrlen(SubText) + 1)
lstrcat(buffer,SubText)
'終了ポジションを確定
EndPos = StartPos + lstrlen(SearchText)
'スタートポジションを進める
StartPos = StartPos + lstrlen(SearchText)
Loop
SubstitutionText = buffer
End Function[/code]