首页 > 解决方案 > 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;
}

}

标签: c++

解决方案


因此,正如评论中所提到的,您的代码中有许多致命的编译器错误(当我按原样通过 Visual Studio 的 C++ 编译器运行它时我收到 7 个错误 - 所以我不确定您是怎么看不到的)。

}首先,您在该函数的末尾缺少一个右大括号 ( )(看起来,它位于的主体之后main)。将}代码的末尾移到FindSubString函数末尾的适当位置将解决该问题。(这可能是复制粘贴错误,或者您可能试图在maininside中定义FindSubString,但在 中是不允许的C++。)

其次,你有错误和丢失的头文件。通常,对于C++程序,您应该使用<iostream>标头而不是<stdio.h>. 后者一般用于C程序;但是,它可以在 中使用C++,但如果您想使用and ,则需要 。(我不确定这是否是标准的一部分,但是当您包含 时,许多实现会自动包含。)您还需要使用容器。<iostream>std::coutstd::cinstdio.hiostream#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循环中FindSubStringbreak;正如您所拥有的,该循环将在第一次出现非元音时终止(由于该语句)。

相反,您应该检查测试字母是否是元音,如果是,则插入哈希集中。我不完全确定您对子字符串的定义是什么,但是这段代码所做的事情接近我认为您想要的(请随时澄清您的目标,或纠正我的假设):

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

推荐阅读