我的辅音/元音替换有啥错误?
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;
对不起,我的代码一团糟。
【问题讨论】:
您在con
和vow
中都有'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;
【讨论】:
不错。consonants
和 vowels
应该是 const string_view
s。 c
应该是 const
。 tolower
needs a cast to unsigned char
。对consonants
/vowels
进行二分搜索将解决您的算法复杂性问题(尽管可以说,在这种规模下,额外的数学运算可能不值得)。
@AsteroidsWithWings:好点。还没有进入 string_view 的“槽”。演员的遗漏很尴尬;我发布的最后一条评论是关于告诉其他人,然后我自己忘记了。 :-D
It was about twenty comments ago,但我会接受你的故事;)
@AsteroidsWithWings:你还没有看到那些又被删除的...
哈,公平。那你至少发了两次,借口就更少了:P以上是关于我的辅音/元音替换有啥错误?的主要内容,如果未能解决你的问题,请参考以下文章