【问题标题】:Returning a substring using c++ within a class在类中使用 C++ 返回子字符串
【发布时间】:2012-06-16 22:59:30
【问题描述】:

所以我有一个子字符串函数,它接收子字符串的起始位置及其长度。这样,它应该提取其中的字符并将它们作为字符串返回,而无需实际使用任何字符串函数。

//default constructor that sets the initial string to the value "Hello World"
MyString::MyString()
{
    char temp[] = "Hello World";

    int counter(0);
    while(temp[counter] != '\0')
    {
            counter++;
    }
    Size = counter;
    String = new char [Size];
    for(int i=0; i < Size; i++)
            String[i] = temp[i];
 }

  //copy constructor
  MyString::MyString(const MyString &source)
 {

    int counter(0);
    while(source.String[counter] != '\0')
    {
            counter++;
    }
    Size = counter;
    String = new char[Size];
    for(int i = 0; i < Size; i++)
            String[i] = source.String[i];

 }

这是我的子字符串函数:

MyString MyString::Substring(int start, int length)
{
 char* leo = new char[length+1];
    for(int i = start; i < start + length+ 1; ++i)
    {
            leo[i-start] = String[i];
    }

    MyString sub;
    delete [] sub.String;
    sub.String = leo;
    sub.Size = length+1;
    return sub;

}

使用 main.cpp 文件中的代码:

  int main (int argc, char **argv)
 {
   MyString String1; // String1 must be defined within the scope

  const MyString ConstString("Target string");      //Test of alternate constructor 

 MyString SearchString;  //Test of default constructor that should set "Hello World". 

  MyString TargetString (String1); //Test of copy constructor


 cout << "Please enter two strings. ";

 cout << "Each string needs to be shorter than 256 characters or terminated by /\n." << endl;

 cout << "The first string will be searched to see whether it contains exactly the second string. " << endl;

cin >> SearchString >> TargetString; // Test of cascaded string-extraction operator


  if(SearchString.Find(TargetString) == -1) {

   cout << TargetString << " is not in " << SearchString << endl;
  }

   else {

   cout << TargetString << " is in " << SearchString << endl;

    cout << "Details of the hit: " << endl;

    cout << "Starting position of the hit: " << SearchString.Find(TargetString) << endl;

    cout << "The matching substring is: " << SearchString.Substring(SearchString.Find(TargetString), TargetString.Length()-1)<<"\n";
  }

返回:

请输入两个字符串。每个字符串必须少于 256 个字符或以 / 结尾 . 将搜索第一个字符串以查看它是否正好包含第二个字符串。

永远

更多

morev 世界并非永远存在

关于为什么它实际上没有从用户输入中输出没有额外字符的单词有什么想法吗?我迷路了。

【问题讨论】:

  • 代码中的String[i]是什么?你在this 上给operator [] 打电话吗?
  • 试过调试器? SearchString 和 TargetString 有你期待的内容吗? Find 和 Length 是否返回您期望的值?
  • @mlt String 是类中的字符串,所以我猜你是对的。
  • @aschepler SearchString 和 TargetString 都是通过用户输入给出的字符串,Find 和 Length 都返回正确的值
  • 你也应该在某个地方delete[]ing sub。

标签: c++ string oop error-handling substring


【解决方案1】:
for(int i = start; i < length+1; i++)

这不是您想要的方式。应该是:

for (int i = start; i < start + length; ++i)

你有一个错误,一旦你意识到它在说什么,你的结束条件就没有意义了。

取一个从索引 2 开始,长度为 5 的子字符串。要复制的字符在索引 2 到 6 处,符合条件。

但是,在内部,您还有另一个问题。除非 i 从 0 开始,否则您不会复制到正确的数组索引中。应该是:

sub [i - start] = String [i];

这样您将在索引 0 处开始填充 sub。

另外,一旦你完成了,你需要空终止它:

sub [length] = '\0';

这样它就不会跑过终点。

【讨论】:

  • 实际上,这使得它在子字符串中添加了一个不需要的字符。例如,我刚刚尝试在 find 中搜索它,它返回子字符串是 ind 而不是 in。我仍然在某处偏离 1。
  • @user1363061,它对我来说工作正常。你确定你正确地输入了结束条件吗?
  • 我相信我做到了。只有当长度为 2 时才会这样做。
  • @user1363061, 2 适合我。我认为您应该在新问题中发布代码。
【解决方案2】:

您可以考虑使用std::copy 算法:

MyString MyString::Substring(int start, int length)
{
    char* sub;
    sub = new char[length + 1];
    sub[length] = '\0';

    std::copy(String + start, String + start + length, sub);
    return MyString(sub);
}

(我假设String 是MyString 对象的一些char * 数据成员。)

【讨论】:

  • 我有点假设std::copy 与“字符串函数”属于同一类别。
【解决方案3】:
MyString MyString::Substring(int start, int length)
{
    char* sub;
    sub = new char[length+1];
    sub[length] = '\0';
    int j = 0;
    for(int i = start; i < start + length; ++i)
    {
        sub[j] = String[i];
        ++j;
    }
    return MyString(sub);
}

类似的东西。

【讨论】:

  • 非常感谢!这有效,但它在子字符串的末尾给了我和额外的字符。我想我在某个地方差了一个?
  • 示例:我只是输入 target 作为搜索的字符串,输入 tar 作为要找到的子字符串,它返回:匹配的子字符串是 target=。当真的它应该只是焦油。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 2023-03-27
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多