在C ++中找到c-string子字符串的麻烦

时间:2015-03-08 05:39:58

标签: c++ c-strings

长时间潜伏,第一次海报。过去六小时我一直在研究这个问题。

问题:

实施以下功能。每个函数处理空终止的C样式字符串。您可以假设传递给函数的任何char数组都将包含空终止数据。将所有函数放在一个文件中,然后创建一个main()函数来彻底测试函数。

注意:除了strlen()之外,您不能使用任何c-string函数。

我遇到第四个功能有问题。 所需的行为是:此函数返回字符串s中的索引,其中可以首先找到子字符串。例如,如果s是“Skyscraper”而substring是“ysc”,则函数将返回2.如果子字符串未出现在字符串中,则应返回-1。

原型:

int findSubstring(char *str, char substring[])

这是我的两个函数定义开始,我不确定是否正在朝着正确的方向前进,我在将循环迭代保持在脑子里时遇到了很多麻烦,任何帮助都会非常感激。< / p>

int findSubstring(char *str, char substring[]){

   int subS = -1, index1 = 0, index2 = 0;
   int length1 = (strlen(str) - 1);
   int length2 = (strlen(substring) - 1);

   if(length1 > length2){
      for(int i = 0; i <= length2; i++){

         for(int j = 0; j <= length1; j++){

            if(*(substring + i) == *(str + j) && *(substring +i) != '\0' ){
               i++;

               if(index1 == 0){
                  index1 = i;
               }
            }

            if( *(substring + i) == '\0'){
               subS = i + 2;
            }
         }
      }
   }

   if (length1 < length2){
      cout << "Invalid, substring exceeds size of string!" << endl;
   }
   return subS;

}



int findSubstring(char *str, char substring[]){
   int index = -1;
   int lengthStr = (strlen(str) - 1);
   int lengthSub = (strlen(substring) - 1);

   if (lengthStr < lengthSub){
      cout << "Invalid input, substring exceeds size of string!" << endl;
   }
   if( lengthSub == 0){
      cout << "";
   }

   if (lengthStr > lengthSub){
      for(int i = 0; i <= lengthSub; i++){
         for(int j = 0; j <= lengthStr; j++){



   }

   return index;
}

2 个答案:

答案 0 :(得分:0)

//You can  replace my  str.size()  and  subString.size()   by  the size of  each  c-string.


int stringPointerOperation( string  str, string subString )
{
    int  pos=0;
    bool  notFound;
    for(int i = 0;  i <  str.size() ;  i++)
    {
        notFound= false;
        if(str[i] == subString[0])
            {
                pos=i;
                for(int  k  = 0 ;  k  < subString.size() &&  k < str.size() ;  k++,i++)
                {
                    if(subString[k] != str[i] )
                        {
                            notFound=true;
                            break;
                        }
                }
            }
    }

    if(notFound) 
        return -1;
    else 
        return pos;

}

答案 1 :(得分:0)

您使用错误的策略在字符串中查找子字符串。外部for循环需要迭代主字符串,内部for循环需要遍历子字符串。

假设您在"de"中寻找"abcdef"。我发现更易于理解和实施的策略是:

我可以从"de" 0开始查找"abcdef"。不,我不能 我可以从"de" 1开始查找"abcdef"。不,我不能 我可以从"de" 2开始查找"abcdef"。不,我不能 我可以从"de" 3开始查找"abcdef"。我可以。返回3

这是一个适合我的版本。

int findSubstring(char *str, char substring[]){

   int i;
   int j;
   int length1 = strlen(str);
   int length2 = strlen(substring);

   if(length1 < length2){
      std::cout << "Invalid, substring exceeds size of string!" << std::endl;
      return -1;
   }

   for(i = 0; i < length1; i++){

      for(j = 0; j < length2; j++){

         // The index to use access the element of str
         // needs to be offset by i.
         if( str[i+j] != substring[j] )
         {
            break;
         }
      }

      if ( j == length2 )
      {
         return i;
      }
   }

   return -1;
}