为什么我按字符串填充元素的长度为零? [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我按字符串填充元素的长度为零? [关闭]相关的知识,希望对你有一定的参考价值。

这是我的问题。我用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;                
     

谁能向我解释我错在哪里或给我一些参考?先感谢您

答案
string ss;

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

ss[c] = ...;

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

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

ss += name[i];

或者你可以使用push_back()

ss.push_back(name[i]);

而且,而不是检查每一个。单。性格,我强烈建议你看看this answer更好的方式。

另一答案

问题出在你的while循环中,并且很容易修复:

ss += name[i];

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

以上是关于为什么我按字符串填充元素的长度为零? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在逗号分隔的字符串集中填充所有字符串[关闭]

NULL 值与零、零长度的字符串或空白(字符值)的区别?

值始终为零 [关闭]

字符串的一部分可以复制到C中的另一个字符串吗?但复制的开始索引不为零[关闭]

在GNU汇编程序中声明一个固定长度的填充字符串

shell脚本编程学习笔记-字符串测试表达式