【问题标题】:Why do I get zero length for a string filled element by element? [closed]为什么逐个元素填充字符串的长度为零? [关闭]
【发布时间】:2019-02-20 17:26:16
【问题描述】:

这是我的问题。我正在使用 g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

进行编译

我想检查字符串的每个元素,只有当它是辅音时才复制它。

这就是我尝试这样做的方式: 这只是一个选择元音的函数:

bool _is_vowel(char a){
    if (a=='a' || a=='A' || a=='e' || a=='E' ||a=='i' || a=='I' || a=='o' || a=='O' || a=='u' || a=='U' || a=='y' || a=='Y')
        return true;
    else return false;
}

这是一段不起作用的代码。具体来说,ss.length() 内部似乎为 0,字符串 ss 不包含任何字符,但它们在 while 循环中正确打印。

 main(){
    int i=0, c=0; 
    string ss, name;
    cout << "insert name\n";
    getline(cin, name);
    while (i<int(name.length())){
       if (!_is_vowel(name[i])){
          cout << name[i]<< "\t";
          ss[c]=name[i];
          cout << ss[c]<< "\n";
          c++;
        }
        i++;
    }    

    cout << int(ss.length())<<endl;
    cout << ss;                
    } 

谁能向我解释我错在哪里或给我一些参考? 提前谢谢你

【问题讨论】:

  • ss[c] 访问一个不存在的字符。使用ss += name[i]
  • 有一种更简单的方法来处理这个问题,无需任何手动循环:std::string ss = name; ss.erase(std::remove_if(ss.begin(), ss.end(), _is_vowel), ss.end());
  • @JesperJuhl 以单个前导 _ 开头的标识符也是保留的,但仅限于全局范围。
  • @JesperJuhl _is_vowel 似乎是在全局范围内声明的。
  • @Eljay 该标准规定定义保留标识符具有未定义的行为。该规则确实可以避免名称冲突,但某些类型的定义,尤其是宏,可能会产生非常不可预测的结果。

标签: c++ string string-length


【解决方案1】:
string ss;

声明一个长度为 0 的字符串。

ss[c] = ...;

然后尝试访问并设置一个不存在的索引。这是未定义的行为。如果您使用了进行边界检查的.at(),您会立即发现这一点。

要解决此问题,您可以使用+= operator 附加到字符串:

ss += name[i];

或者你可以使用push_back():

ss.push_back(name[i]);

此外,而不是检查每一个。单身的。角色,我强烈建议您查看this answer 以获得更好的方法。

【讨论】:

    【解决方案2】:

    问题出在您的 while 循环中,很容易解决:

    ss += name[i];
    

    你只需要连接到你的字符串

    【讨论】:

    • 这似乎没有为其他答案添加任何内容。
    • @HolyBlackCat 道歉,当我发布我的答案时页面刷新了。虽然我确实更快地进入了重点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2013-05-21
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2021-04-26
    相关资源
    最近更新 更多