我的辅音/元音替换有啥错误?

Posted

技术标签:

【中文标题】我的辅音/元音替换有啥错误?【英文标题】:What is the error in my consonant/vowel replacer?我的辅音/元音替换有什么错误? 【发布时间】:2020-05-11 19:24:23 【问题描述】:

所以我正在制作一个小程序。您输入一个字符串然后我的程序输出该字符串,除了a是辅音现在是“C”而元​​音是“V”。为什么当我输入时它输出错误“ Elicopter”或者其他词?

#include <iostream>
#include <string>
using namespace std;

int main()

const char con[]='b','c','d','f','g','h','i','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z','B','C','D','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z';
const char vow[]='a','e','i','o','u','A','E','I','O','U';
const char car[]='!','@','#','$','%','^','&','*','?','+','-','_','0','1','2','3','4','5','6','7','8','9';
int scon=sizeof(con)/sizeof(con[0]);
int svow=sizeof(vow)/sizeof(vow[0]);
int scar=sizeof(car)/sizeof(car[0]);
string x;
int i,j;

getline(cin,x);

for(i=0;i<x.length();i++)
    if(x[i]==' ')
        cout<<" ";
    

    else

    for(j=0;j<scon;j++)
        if(x[i]==con[j])
            cout<<"C";
            break;
        
    
    for(j=0;j<svow;j++)
        if(x[i]==vow[j])
            cout<<"V";
            break;
        
    
    for(j=0;j<scar;j++)
        if(x[i]==car[j])
            cout<<x[i];
            break;
        
    





    return 0;

对不起,我的代码一团糟。

【问题讨论】:

您在convow 中都有'i' 欢迎来到 Stack Overflow 和一般编程。我们都编写了无法按照我们想要的方式工作的代码。要找出问题需要调试。 This article 有一些很棒的提示可以帮助您入门。使用这些技巧,你可以找到你的代码没有达到你期望的地方。 这真的很需要std::vector,而不是用sizeof 做数学并猜测有多少个整数。 【参考方案1】:

除了@1201ProgramAlarm 已经指出的明显内容('i' 在辅音列表中)之外,还有很多非常单一的代码——就像你用 C 编码的方式,而且 C 质量相当低那个(没有冒犯)。

虽然没有任何代码是完美的,但也许您可以从用实际 C++ 编写的相同(嗯,非常相似...)程序中受益。只是想知道您可以做什么。

#include <iostream>
#include <string>
#include <string_view>
#include <locale>

// "using namespace" is a habit that tends to get in the way
// once you start including headers from multiple namespaces,
// so while it has its place in quick one-shots, personally I
// got into the habit of fully qualifying.

int main()

    // This is, of course, very non-international, but I will
    // let this slide and not drag the ICU library into this...
    std::string_view const consonants  "bcdfghjklmnpqrstvwxyz" ;
    std::string_view const vowels  "aeiou" ;
    std::string input;

    // while instead of if allows you to make multiple lines of
    // input. <Ctrl>-D to end the program (<Ctrl>-Z <Enter> on
    // Windows).
    while ( getline( std::cin, input ) )
    
        // Range-For eliminates the need for loop counters / iterators
        for ( auto const c : input )
        
            if ( consonants.find( std::tolower( static_cast<unsigned char>( c ) ) ) != std::string::npos )
            
                std::cout << 'C';
            
            else if ( vowels.find( std::tolower( static_cast<unsigned char>( c ) ) ) != std::string::npos )
            
                std::cout << 'V';
            
            else if ( std::isprint( static_cast<unsigned char>( c ) ) )
            
                // Not exactly the same as your list of digits
                // and punctuation, but similar, and showing the
                // use of character types. isprint() is also true
                // for ' '.
                std::cout << c;
            
        

        // std::endl ensures a flush of the write buffer
        std::cout << std::endl;
    

【讨论】:

不错。 consonantsvowels 应该是 const string_views。 c 应该是 consttolower needs a cast to unsigned char。对consonants/vowels 进行二分搜索将解决您的算法复杂性问题(尽管可以说,在这种规模下,额外的数学运算可能不值得)。 @AsteroidsWithWings:好点。还没有进入 string_view 的“槽”。演员的遗漏很尴尬;我发布的最后一条评论是关于告诉其他人,然后我自己忘记了。 :-D It was about twenty comments ago,但我会接受你的故事;) @AsteroidsWithWings:你还没有看到那些又被删除的... 哈,公平。那你至少发了两次,借口就更少了:P

以上是关于我的辅音/元音替换有啥错误?的主要内容,如果未能解决你的问题,请参考以下文章

C ++从文本文件中计算元音辅音

以元音、辅音开头的单词的读数

如何计算熊猫数据框中的元音和辅音(大写和小写)?

如何检查Java中的句子中有多少个辅音和元音?

如何编写一个函数,将句子中每个单词开头的所有辅音字符串转换为“r”,直到它变成元音?

实现语音搜索的最有效方法