给出运行时错误的字符串操作方法

时间:2010-10-11 13:16:02

标签: c++ string

这似乎给了我一些麻烦。该方法应该生成一个随机数并将其分配给char。 getline从文本文件中获取整个字符串并将其分配给食物。 y的目的是在食物串中保存它所在的位置。然后它将使用该int从字符串中删除并打印出剩下的内容。

我一直得到“程序已经请求以不寻常的方式因运行时错误而关闭”并且它已锁定。提前致谢。

   void feedRandomFood()
   {
       int y = 0;
       int x = rand() % food.size() + 1; //assigns x a random number between 1 and food.size MAX
       char c = '0' + x; //converts int to char for delimiter char.
       ifstream inFile;
       inFile.open("OatmealFood.txt", ios::in);
       string foods = "";
       getline(inFile, foods); 
       inFile.close();
       y = foods.find(c); 
       foods.erase(y); //erase characters up to the char found 
       cout << foods;
   }

3 个答案:

答案 0 :(得分:2)

如果find方法无法在字符串c中找到foods怎么办?它返回npos,当你在erase中使用它时,你的程序会被打击。

因此,您需要在执行erase之前添加此检查:

y = foods.find(c);
if( y != string::npos) {
    foods.erase(y); 
}

另外,在尝试从中读取一行之前,应始终确保文件open成功。

inFile.open("OatmealFood.txt", ios::in);
if(!inFile.is_open()) {
  // open failed..take necessary steps.
}

答案 1 :(得分:1)

我无法评论来自dcp的上述解决方案(还没有足够的帖子),为什么不使用其他可用的擦除方法?你为什么需要一个while循环?

你可以简单地打电话:

foods.erase(0,loc);

(你能不能?)

答案 2 :(得分:0)

尝试:

请注意,foods.erase(y)将从'f'向前删除字符。如果要将字符删除到'f',请参阅此示例:

以下是如何删除字符的简单示例:

  string x = "abcdefghijk";
  // find the first occurrence of 'f' in the string
  int loc = x.find('f');

  // erase all the characters up to and including the f
  while(loc >= 0) {
    x.erase(x.begin()+loc);
    --loc;
  }
  cout<<x<<endl;

节目输出:

---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
ghijk

> Terminated with exit code 0.

所以对于你的例子,你需要这样的东西:

while(y >= 0) {
    foods.erase(foods.begin() + y);
    --y;
}

修改 您也可以消除while循环,只需调用重载的erase,如下所示:

  string x = "abcdefghijk";
  int loc = x.find('f');
  if (loc >= 0) {
    x.erase(x.begin(),x.begin()+loc+1);
    cout<<x<<endl;
  }

节目输出:

---------- Capture Output ----------
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
ghijk

> Terminated with exit code 0.