在C++中查找 c 字符串子字符串时遇到问题

Trouble with finding a c-string substring in C++

本文关键字:字符串 遇到 问题 C++ 查找      更新时间:2023-10-16

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

问题:

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

注意:您不能使用 strlen() 以外的任何 c 字符串函数。

我在使用第四个功能时遇到问题。所需的行为是:此函数返回字符串 s 中的索引,其中首先可以找到子字符串。例如,如果 s 是"摩天大楼",子字符串是"ysc",则该函数将返回 2。如果子字符串未出现在字符串中,则应返回 -1。

原型:

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

这是我对函数定义的两个开始,我不确定任何一个是否朝着正确的方向发展,我在保持循环迭代时遇到了很多麻烦,任何帮助将不胜感激。

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) != '' ){
               i++;
               if(index1 == 0){
                  index1 = i;
               }
            }
            if( *(substring + i) == ''){
               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;
}
//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;
}

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

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

我能从"abcdef" 0开始找到"de"吗?不,我不能。
我能从"abcdef" 1开始找到"de"吗?不,我不能。
我能从"abcdef" 2开始找到"de"吗?不,我不能。
我能从"abcdef" 3开始找到"de"吗?是的,我可以。返回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;
}
相关文章: