3

当我输入输入字符串时,程序卡住了。我已经测试了程序中的所有其他分支,所以问题就在这里。

注意:无限循环是故意的,应该被 break 语句打破。

for (i = 0 ;  i >= 0 ; i++)
{
  text.append("kk");
  if ((text.find("." , j)) < 0 )
  {
     text.erase(text.size() - 2, 2);
     text2.append(text);
     writer << text2 << endl;
     text2.clear();
     j = 0;
     break;
  }
  else
  {
     j = text.find("." , j) + 1; 
     k = j + 1;
     letter = static_cast <int> ( text.at(k) );
     if (( letter < 123 ) && ( letter > 96 ))
     {
       letter = (letter - 32);
       (text.at(k)) = static_cast <char> (letter);
       text.erase(text.size() - 1, 2);
     }
   else 
   {
     text.erase(text.size() - 1, 2); 
   }
  }
}
4

4 回答 4

2

正如其他人已经指出的那样,您已经有一个无限循环。我通常会看到以下格式的字符串查找循环。

int found = 0; 
while ((found = text.find(".", found )) != string::npos) {
    //...
}
于 2013-09-18T16:15:10.297 回答
2

这是因为你永远不会删除,.所以你永远不会进入你的第一个if条件(有中断的那个)。

您的逻辑如下所示:

Append "kk" to the string
If you don't find a '.'
  exit
Else
  If the second letter after the '.' is lower case
    Change it to upper case
    Delete the last letter in the string
  Else
    Delete the last letter in the string

然后你再次循环

假设您的字符串是: zzz.abcd 您的迭代将是:

zzz.aBcdk
zzz.aBcdkk
zzz.aBcdkkk

ETC..

这是造成最大伤害的那一行:

j = text.find("." , j) + 1;

在这里,如果您没有找到“.”,则将 j 设置为 0 (-1 + 1),因此在下一次迭代中,您将再次进行完全相同的搜索。

于 2013-09-18T16:25:44.463 回答
1

编辑:没关系,我的回答是错误的。我不知道 std::npos 是一个设置为-1的常量。

该行: if ((text.find("." , j)) < 0 )

永远不会是真的,所以中断永远不会执行。

std::string.find()如果未找到文本,则返回std::npos,而不是小于 0 的值。

参见:std::string.find()

于 2013-09-18T16:38:02.193 回答
0

我知道你想坚持你的代码,但是,它真的很糟糕,我讨厌你学习坏习惯。

有时,甚至大多数时候,我们作为开发人员必须能够从代码示例中学习。我知道您不想使用任何您不理解的代码结构。但是,在大学和工作中,您将不得不从您不理解的代码中学习。这是提高技能和知识的好方法。

我写了一些代码来解决你的问题。这可能不是最好的解决方案。它已经过测试并且可以工作。请查看此代码并询问您是否有任何不明白的地方。希望这对您有价值。

#include <string>
#include <cctype>

void ToUpper( std::string& text, int position );

void ToUpper( std::string& text, int position )
{
    char c;

    c = text.at(position);
    text.at(position) = std::toupper(c);

    return;
}


int main(int argc, char *argv[])
{
    std::string text = "this is. a very simple. example. ok.";

    int found = 0;

    //Handle first character of sentence
    if ((found = text.find_first_not_of(" ", 0)) != std::string::npos)
    {
        ToUpper( text, found );     
    }

    while ((found = text.find(".", found )) != std::string::npos)
    {
        found = text.find_first_not_of(" .", found);
        if( found != std::string::npos )
        {
            ToUpper( text, found );
        }
    }

    return 0;
}
于 2013-09-18T20:35:03.580 回答