这是我的代码:
#include <iostream>
#include <string>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while(n--)
{
string str;
char a[] = {'a','e','i','o','u','A','E','I','O','U'};
getline(cin, str);
for(int i=0 ;i<str.length(); i++)
{
for(int j=0; j<10; j++)
{
if(str[i]==a[j])
{
cout << str[i];
}
}
}
cout << "\n";
}
return 0;
}
测试用例是:
HmlMqPhBfaVokhR
wdTSFuI
IvfHOSNv
我没有删除任何东西,但我只打印元音。但是,一些测试用例没有通过。也许这段代码不适用于多个测试用例。请帮帮我。
答案 0 :(得分:3)
试试这个:
int main()
{
int n;
std::cin >> n;
std::cin.ignore(); // fix
/* remaining code */
return 0;
}
<强>&GT;编程以字符串形式查找元音
在字符串中查找元音的最佳方式是使用二进制搜索。这是提示:
char array
元音的向量(按升序排列)std::binary_search
元音阵列。binary_search
返回true
,则打印字符串的字符。#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
int main()
{
std::vector <char> a = {'a','e','i','o','u','A','E','I','O','U'};
std::sort(a.begin(), a.end()); // need sorted, for binary search
std::string str = "HmlMqPhBfaVokhR wdTSFuI IvfHOSNv";
std::for_each(str.begin(), str.end(), [&](const auto& str_char)->void
{
if(std::binary_search(a.begin(), a.end(), str_char)) std::cout << str_char << " ";
});
return 0;
}
输出:
a o u I I O
<强>&GT;用于删除字符串中的元音的程序
使用 erase-remove idiom ,如果您的实际目标是从用户输入中移除元音(str
)。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
int main()
{
std::vector <char> a = {'a','e','i','o','u','A','E','I','O','U'};
std::sort(a.begin(), a.end()); // need sorted, for binary search
std::string str = "Hello World";
str.erase(std::remove_if(str.begin(), str.end(), [&a](const auto& str_char)->bool
{
return std::binary_search(a.begin(), a.end(), str_char);
}), str.end() );
std::cout << str << "\n";
return 0;
}
输出:
Hll Wrld
PS :并且避免使用
#include<bits/stdc++.h>
using namespace std;
答案 1 :(得分:1)
除了已经回答的std::getline
问题:
for(int i=0 ;i<str.length(); i++)
{
for(int j=0; j<10; j++)
{
if(str[i] == a[j])
{
// this is the one you do NOT want to print...
// cout<<str[i];
// skip instead:
goto SKIP;
}
}
std::cout << str[i]; // output the one NOT skipped...
SKIP: (void)0;
}
好的,不想开始讨论goto
的用法,有很多方法可以避免它,例如: G。通过将内部for循环打包成单独的(内联)函数。但是,你可以更容易,因为已经存在这样的功能;使用基于范围的for循环,代码变得更加容易:
for(auto c : str)
{
if(!strchr("aeiouAEIOU", c))
{
std::cout << c;
}
}
strchr
(来自cstring)返回一个指向字符串中第一个字符的指针,该字符等于引用字符 - 如果找不到则返回nullp ...
要以现代C ++方式真正从字符串中删除元音,请考虑以下事项:
str.erase(std::remove_if(
str.begin(), str.end(),
[](char c) { return strchr("aeiouAEIOU", c) != nullptr; }
), str.end());
答案 2 :(得分:0)
您的代码可能看起来像(请参阅内联评论):
#include <iostream>
#include <string>
using namespace std;
int main() {
string vowels = "aeiouAEIOU";
int n;
cin>>n; // assume this stands for line count
while(n-- >= 0)
{
string str, result;
getline(cin, str);
for(int i=0 ;i<str.length(); i++)
{
if (vowels.find(str[i]) != std::string::npos)
result += str[i]; // add character to result if it is not consonant
}
cout<<result<<"\n"; // print result
}
return 0;
}