首页 > 解决方案 > 存储到“char”类型的空指针

问题描述

当我在 leetcode 上解决问题 3 时,我遇到了问题。我编写了代码,它在Dev-C++编译器上工作,我复制代码并粘贴到 leetcode。得到这个错误:Line 10: Char 9: runtime error: store to null pointer of type 'char' (solution.c)。我检查了代码,但找不到一些问题。我希望得到一些帮助。代码粘贴在下面。

int lengthOfLongestSubstring(char * s){
    int longestlength = 0;  // 最长子串的长度 
    int i = 0;
    char *temp; // 存储子串 
    char *p;
    char *base;

    * temp = * s; // *temp存储s的第一个字符 
    base = temp;

    while(*++s != '\0') {
        p = base;
        while(*p++ != '\0') {
            if (*p == *s) {
                *temp = '\0';
                break;
            }
        }
        if (*temp == '\0') {
            *temp++ = *s;
            base = temp;
            i = 0;  // 重新计数 
        }
        else {
            *++temp = *s;
            ++i;
        } 
        longestlength = i > longestlength ? i : longestlength;
    } 

    return longestlength;
}
测试示例
char* s = "pwwkew";

标签: c

解决方案


该函数是 leetcode here提出的问题的建议解决方案。

据我了解,我们必须返回最长子字符串的长度而不重复字符。当最后一个字符出现在子字符串中的任何位置时,子字符串结束。

提供的代码存在许多问题。

  • 错误是因为没有temp.
  • base是一个不是终止字符串的副本temp,但它是用指针​​扫描的p
  • i在某些条件下增加,但从不重置为零。当一个新的子串开始时,它应该被重置为 0。
  • 等等

我看不出这段代码如何提供预期的答案。

算法如下。

我们从一个子字符串开始,它的第一个字母在 index 处i(初始化为 0),我们考虑在 index 处子字符串的最后一个字符j。我们检查字符是否存在于子字符串中。如果是,我们遇到了子字符串的结尾。它的长度是j-ilongestLength然后设置为最长长度和 的最大值j-ii我们通过设置子字符串中重复字母之后的字母来开始一个新的子字符串。最后,我们增加j.

这是代码

int lengthOfLongestSubstring(char *s){
    if (s == NULL || *s == '\0')
        return 0;
    int longestlength = 1;
    int i = 0, j = 1;
    while (s[j] != '\0') {
        // check if s[j] is in substring
        int k = i;
        while (k < j) {
            if(s[k] == s[j])
                break;
            k++;
        }
        // if we found a duplicate letter at index k
        if (k != j) {
            // we reached the end of the substring
            longestLength = j-i > longestLength ? j-i : longestLength;
            // next substring start at k+1
            // and is one character long
            i = k+1;
            j = i;
        }
        j++;
    }
    return longestLength;
}

推荐阅读