Реализация strstr - PullRequest
       22

Реализация strstr

0 голосов
/ 17 февраля 2012

Я пытаюсь написать функцию strstr с нуля. Я проходил мой код построчно в отладчике, и он отлично работает. Тем не менее, он не сохраняет начало подстроки, которую он ищет должным образом. И, следовательно, он не возвращает его должным образом. У меня нет большого опыта программирования, поэтому мой код немного запутан и запутан. Тем не менее, это работает по большей части. Вот мой код ниже (прокомментировал для моего профессора и для всех вас, чтобы увидеть, что я сделал). (также мой профессор уже выразил свое согласие с функцией goto)

char *strgstr(const char *str1, const char *str2)
{
    //I went through this function line by line with the debugger
    //The only problem with it is when I go to save the location of the
    //substring in str1.  
    //I posted a question on stackoverflow and I was able to get it to compile
    //but it still doesn't save and return properly.  The rest of the function works.
    int len_str1=strlen(str1);
    int len_str2=strlen(str2);
    char *save_str=NULL;
    int i=0;
    for(; i<len_str1; i++)
    {
there:
        if(str1[i]==str2[0])            //checks if this is the beginning of str2
        {
            save_str=(char*)str1[i];    //This is where the problem is. 
            int j=0;                    //start at beginning of str2
            for(;i<len_str1;i++)        //index str1
            {
                if(j<len_str2)          //checks if we've finished searching str2
                {
                    if(str1[i]!=str2[j])
                    {
                        goto there;
                    }
                    j++;
                }
                else
                {
                    return save_str;    //does not return properly.  I can't figure out how to save a particular point in the index to a pointer. 
                }
            }
        }

    }
}

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

Строка, которую вы написали как

save_str=(char*)str1[i];    //This is where the problem is. 

должно быть (например)

save_str = str1 + i;   

Ваша оригинальная версия рассматривает числовое значение символа как указатель, что совершенно неверно.

2 голосов
/ 17 февраля 2012

Зачем вам нужен такой сложный код?

const char *strgcstr(const char *haystack, const char *needle)        
{
 while(*haystack!=0)
 {
   if( (*haystack == *needle) &&
       (strncmp(haystack, needle, strlen(needle)) == 0) )
   return haystack;
  haystack++;
 }
 return NULL;
}
0 голосов
/ 04 февраля 2018

Java-код для strstr

class Solution {
public int strStr(String haystack, String needle) {
    String res ="";
    int pos = 0;
    if(needle.length() == 0){
        return 0;
    }
    if(haystack.equals(needle)){
        return 0;
    }
    if (needle.length()>haystack.length()||haystack.length() == 0){
        return -1;
    }
    for(int i =0; i<haystack.length();i++){
            if(haystack.charAt(i) == needle.charAt(0)){
                if(i+needle.length() <= haystack.length()){
                res = haystack.substring(i,i+(needle.length()));
                if (res.equals(needle)){
                pos = i;
                return pos;
                }
        }
                else{
                    return -1;
                }
            }
            else{
                continue;
            }
        }
        return -1;

}
}
...