我希望我的函数检查我的字符串是否具有特定字符。 它应该返回指针的最后一次出现。但是当我启动程序时,它会给我存储访问错误。
char *strrchr(const char *s, int c) {
int index = 0;
for(int i = 0; i < strlen(s); i++) {
if (s[i] == c)
index = i;
}
if (index)
return NULL;
else
return s[index];
}
答案 0 :(得分:3)
我做了2次修复。索引的值应该初始化为-1,因此它不能与字符串中的有效索引混淆。此外,您需要返回“[index]的地址:使用&amp; s [index]
char *strrchr (const char *s, int c){
int index=0; // change to -1
for(int i=0; i<strlen(s); i++){
if(s[i]==c)
index=i;
}
if(index == -1) // check for -1
return NULL;
else
return &s[index];
}
答案 1 :(得分:1)
您的返回逻辑不正确。找到匹配项时返回NULL。
否则,返回Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim arrList As Variant, cell As Range
Dim rowLast As Long, searchRow As Long
For Each cell In Target
If cell.Column = 4 And Trim(cell.Value2) <> vbNullString Then
rowLast = cell.Parent.Cells(cell.Parent.Rows.Count, 4).End(xlUp).Row
arrList = cell.Parent.Range("D1:D" & rowLast).Value2
For searchRow = LBound(arrList) To UBound(arrList)
If searchRow <> cell.Row Then
If arrList(UBound(arrList), 1) = arrList(searchRow, 1) Then
cell.Parent.Activate
Union(cell, cell.Parent.Range("C" & searchRow & ":F" & searchRow)).Select
MsgBox "This name exists already in row " & searchRow & _
Chr(10) & " with the S. No. " & searchRow - 6 & _
Chr(10) & Chr(10) & "This name will be now removed..."
Application.EnableEvents = False
cell.ClearContents
Application.EnableEvents = True
End If
End If
Next searchRow
End If
Next cell
End Sub
而不是指向索引的指针。
当您可以使用空字节时,您也不需要计算字符串长度。
char
答案 2 :(得分:1)
您的实施有多个问题:
当字符找到且非零偏移时,您返回NULL
。
您返回str[index]
处的字符,而不是可以写为&str[index]
的地址str + index
。
在偏移0
找到该字符时,您无法区分找到该字符的失败。
int
的{{1}}类型不正确:字符串的长度可能超过index
类型的最大值。您应该使用类型int
或增加指针。
size_t
时无法找到最终'\0'
。
c == 0
应在扫描前将其strrchr()
参数int
转换为c
。
以下是简化版本:
char