如何检查特定字符的字符串

时间:2017-03-18 19:02:22

标签: c

我希望我的函数检查我的字符串是否具有特定字符。 它应该返回指针的最后一次出现。但是当我启动程序时,它会给我存储访问错误。

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];
}

3 个答案:

答案 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