c++ - Visual Studio Code 2019 生成执行文件失败
问题描述
我是 C++ 新手。我遇到了在子字符串中查找元音(即“a”、“e”、“i”、“o”、“u”)的问题,然后我正在考虑更改驱动程序函数以获取用户输入。不幸的是,这段代码没有在 Visual Studio Code 中生成执行文件,也没有任何错误消息。任何帮助将不胜感激。仅供参考,功能代码来自 GeeksforGeeks。谢谢!
#include <stdio.h>
#include <string>
using namespace std;
// return true if x is vowel
bool isVowel(char x){
// function to check if x is in vowel or not
return (x == 'a' || x == 'e' || x =='i' || x == 'o' || x=='u');
}
void(FindSubString(std::string str)){
set<char> hash; // to store vowel
// outer loop picks starting characters
// and inner loop picks for ending characters
int n = str.length();
for (int i =0; i<n; i++){
for (int j = i; j <n; j++){
// if current position is not vowel,
// then no more possible string starting from str[i]
if (isVowel(str[j])==false)
break;
// if vowel, insert into hash
hash.insert(str[j]);
//if all vowels are present in current substring
if (hash.size()==5)
cout << str.substr(i, j-i+1) << " ";
}
hash.clear();
}
int main()
{
string str = getstring("insert a string: %s\n", stdin);
FindSubString(str);
return 0;
}
}
解决方案
因此,正如评论中所提到的,您的代码中有许多致命的编译器错误(当我按原样通过 Visual Studio 的 C++ 编译器运行它时,我收到 7 个错误 - 所以我不确定您是怎么看不到的)。
}
首先,您在该函数的末尾缺少一个右大括号 ( )(看起来,它位于的主体之后main
)。将}
代码的末尾移到FindSubString
函数末尾的适当位置将解决该问题。(这可能是复制粘贴错误,或者您可能试图在main
inside中定义FindSubString
,但在 中是不允许的C++
。)
其次,你有错误和丢失的头文件。通常,对于C++
程序,您应该使用<iostream>
标头而不是<stdio.h>
. 后者一般用于C
程序;但是,它可以在 中使用C++
,但如果您想使用and ,则需要 。(我不确定这是否是标准的一部分,但是当您包含 时,许多实现会自动包含。)您还需要使用容器。<iostream>
std::cout
std::cin
stdio.h
iostream
#include <set>
std::set
而且,最后一个致命错误是您调用getstring
. 这不是标准库函数。因此,您可以自己定义它,也可以只使用main
下面函数中的代码:
int main()
{
string str;
cout << "insert a string: ";
cin >> str;
// string str = getstring("insert a string: %s\n", stdin);
FindSubString(str);
return 0;
}
在定义函数的方式中还有一个“特殊性”(尽管实际上不是错误,正如我的第一个版本的答案所建议的那样)FindSubString
,带有“额外”(不需要,并且非常混乱)的括号集。应该是这样的:
void FindSubString(std::string str)
{
但是,即使修复了所有这些错误,您的代码也无法正常工作!这是因为您的逻辑存在缺陷,在函数的内部for
循环中FindSubString
。break;
正如您所拥有的,该循环将在第一次出现非元音时终止(由于该语句)。
相反,您应该检查测试字母是否是元音,如果是,则插入哈希集中。我不完全确定您对子字符串的定义是什么,但是这段代码所做的事情接近我认为您想要的(请随时澄清您的目标,或纠正我的假设):
void FindSubString(std::string str)
{
set<char> hash; // to store vowel
int n = str.length();
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (isVowel(str[j])) hash.insert(str[j]); // if vowel, insert into hash
//if all vowels are present in current substring
if (hash.size() == 5)
cout << str.substr(i, j - i + 1) << " ";
}
hash.clear();
}
}
显示的代码将找到包含五个元音的所有子字符串。
样本输入:
facetiously
输出:
facetiou facetious facetiousl facetiously acetiou acetious acetiousl acetiously