循环退出无缘无故

时间:2011-08-28 22:40:44

标签: c++ string loops iterator cout

我有一个关于C ++的问题。这是我目前的职能:

string clarifyWord(string str) {
    //Remove all spaces before string
    unsigned long i = 0;
    int currentASCII = 0;

    while (i < str.length()) {
        currentASCII = int(str[i]);
        if (currentASCII == 32) {
            str.erase(i);
            i++;
            continue;
        } else {
            break;
        }
    }

    //Remove all spaces after string
    i = str.length();
    while (i > -1) {
        currentASCII = int(str[i]);
        if (currentASCII == 32) {
            str.erase(i);
            i--;
            continue;
        } else {
            break;
        }
    }
    return str;
}

为了让基本和明显的事情不受影响,我有#include <string>using namespace std;所以我可以访问字符串函数。

虽然循环正在退出,但有时会跳过第二个循环。我将str传递给" Cheese ",它应该删除字符串之前和字符串之后的所有空格。

在main函数中,我还将变量分配给clarifyWord(str),其中str位于上方。似乎没有使用cout << str;打印出来。

打印字符串或循环使用字符串时是否缺少某些内容? ASCII代码32也是Space

5 个答案:

答案 0 :(得分:2)

好的,所以你调用的擦除功能如下所示:

string& erase ( size_t pos = 0, size_t n = npos );

n参数是要删除的项目数。 npos表示删除所有内容直到字符串结尾,因此将第二个参数设置为1。

str.erase(i,1)

[编辑]

您可以将第一个循环更改为:

while (str.length() > 0 && str[0] == ' ')
{
   str.erase(0,1);
}

和第二个循环:

while (str.length() > 0 && str[str.length() - 1] == ' ')
{
   str.erase(str.length() - 1, 1);
}

答案 1 :(得分:1)

在第二个循环中,您无法将i初始化为str.length()。

str [str.length()]将在字符串结束之后,因此不太可能是空格(从而触发第二个循环的中断)。

答案 2 :(得分:1)

当您在循环中检查其大小时,您正在使用erase(修改字符串)。这是处理字符串的危险方式。当你返回一个新字符串时,我建议你首先在非空格字符的字符串中搜索第一个匹配项,然后搜索最后一个字符串,然后返回一个子字符串。某些事情(未经测试):

size_t init = str.find_first_not_of(' ');
if (init == std::string::npos)
    return "";
size_t fini = std.find_last_not_of(' ');
return str.substr(init, fini - init + 1);

你看,没有循环,擦除等等。

答案 3 :(得分:0)

未签名很长我... while (i > -1)嗯,这不对,是吗?您希望如何工作?事实上,编译器将两个操作数转换为相同的类型:while (i > static_cast<unsigned long>(-1))。而这只是编写ULONG-MAX的另一种方式,即while (i > ULONG_MAX)。换句话说,while(false)

答案 4 :(得分:0)

您使用的擦除不正确。它会从pos到npos擦除 即字符串&amp; erase(size_t pos = 0,size_t n = npos);

请参阅:http://www.cplusplus.com/reference/string/string/erase/

更好的方法是记下第一个非空格的位置以及空格出现在字符串末尾的位置。然后使用substr或erase两次。

你也不需要这样做的麻烦:

 currentASCII = int(str[i]);
       if (currentASCII == 32) {

而是这样做:

if (str[i] == ' ') {

我认为你会同意的更容易阅读。

所以,你可以通过以下方式缩短它:(未经测试,但它不应该很远 关)

string clarifyWord(string str) {
  int start = 0, end = str.length();
  while (str[start++] == ' ');
  while (str[end--] == ' ');
  return str.substr(start, end);
}