Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个简单的程序,包含一个由于某种原因而卡住的循环_C++_String_For Loop - Fatal编程技术网

C++ 一个简单的程序,包含一个由于某种原因而卡住的循环

C++ 一个简单的程序,包含一个由于某种原因而卡住的循环,c++,string,for-loop,C++,String,For Loop,当我输入一个输入字符串时,程序被卡住了。我已经测试了程序中的所有其他分支,所以问题就在这里 注意:无限循环是有意的,应该被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 << te

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

注意:无限循环是有意的,应该被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); 
   }
  }
}
(i=0;i>=0;i++)的

{
文本。附加(“kk”);
如果((text.find(“.”,j))<0)
{
text.erase(text.size()-2,2);
text2.追加(文本);

writer正如其他人所指出的,您已经有了一个无限循环

int found = 0; 
while ((found = text.find(".", found )) != string::npos) {
    //...
}

这是因为您从未擦除
,因此您从未输入第一个
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
等等

这是造成最大损坏的线路:

j=text.find(“.”,j)+1;


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

EDIT:Nevermind,我的答案是错误的。我不知道std::npos是一个设置为-1的常量

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

永远不会是真的,因此中断永远不会执行

std::string.find()
如果找不到文本,则返回
std::npos
,值不小于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;
}
#包括
#包括
void ToUpper(标准::字符串和文本,int位置);
void ToUpper(标准::字符串和文本,int位置)
{
字符c;
c=文本。在(位置);
text.at(位置)=std::toupper(c);
返回;
}
int main(int argc,char*argv[])
{
std::string text=“这是一个非常简单的示例。好的。”;
int=0;
//处理句子的第一个字符
if((find=text.find_first_not_of(“,0))!=std::string::npos)
{
ToUpper(文本,已找到);
}
而((found=text.find(“.”,found))!=std::string::npos)
{
found=text.find_first_not_of(“.”,found);
如果(找到!=std::string::npos)
{
ToUpper(文本,已找到);
}
}
返回0;
}

std::toupper
将执行您试图执行的操作。请不要编写“由于某些原因,程序被卡住”。将您的程序放入调试器中,单步执行代码,观察变量,然后您将确切知道它被卡住的位置和原因。is'(text.find(“.”,j))<0'真的吗?也许你从来没有满足过这个条件,因此也从来没有碰到过break语句。我是一个总共编程了10个小时的人,我甚至不知道什么是调试器……是的,如果满足了这些条件,调试器就会中断,但是如果不满足这些条件,它就不会中断。而且continue也没用。无限循环I这是故意的,因为我不知道我正在使用的字符串将有多长。它被设计为在满足
中断
条件时被中断。@user2779581我明白,我发布的while循环是执行此操作的常用方法。它将搜索整个字符串,直到它们不再有句点为止。谢谢你,我只是真正的u不过,唱一些我现在完全理解的东西。否则,我只会使用一些我没有完全意识到其潜力的东西,然后我只会在这类事情上表现得很差。我想你不会看到任何其他潜在的问题吧?@user2779581没问题,你目前的方法有太多分支很难维护。无限循环很好,有时可以简化事情,但这不是一种情况。此外,值得努力学习常见的做法并理解它们的普遍性。我非常清楚,它开始变得难以控制了!:P我几天后就要上大学了,我很可能会学习common练习当我到达那里时,我只是想在我离开之前做些事情,但似乎没有人知道如何解决这个问题。如果你不介意我说的话,我想你是错的。
j=text.find(“.”,j)+1;
将使j在句号之前是一个字符,因此它在下一次迭代中开始在它之前搜索。然后,k在句号之前是一个字符,因此它是句号之后的第二个字符。然后,
擦除
函数将删除我理解的最后两个字符,除非我在该部分出错。原因是什么k需要在那里是因为我最终引用了字符串范围之外的东西,如果它不在那里。我已经添加到我的答案中,以使它更清楚。但我坚持原来的观点。如果你在每次迭代中添加字符串的写入,这将完全如我所说。但是如果什么都没有找到,这并不重要它肯定会直接到出口?所以如果没有找到周期,它就不会到达可以自己重置循环的阶段?虽然你是对的,他应该使用std::npos,其实这不重要,因为std::npos是一个定义为-1的常数是的,我想说我之前试过,当没有f时它会给出-1ound.我希望有人能得到答案arghhhh!!我刚才在调用中使用了cout,当句子中没有句点时,用一个不包含句点的字符串测试它,a