2017-09-16 26 views
0

好吧,这是我的代码:检查,如果用户键入阵列辅音

#include <iostream> 
#include <string> 
#include <cstring> 

using namespace std; 

char arr[] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'}; 
int y = 0; 
string x; 
const char* z; 

int main() 
{ 
cin >> x; 

z = x.c_str(); 

if (x.length() == 1) 
{ 
for (y == 0; y <= 20; y++) 
    { 
    if (*z == arr[y]) 
     { 
     cout << "Consonant" << endl; 
     break; 
     } 
    else 
     { 
     cout << "Not a consonant" << endl; 
     break; 
     } 
    } 
} 
} 

所以这应该告诉我,如果我输入的字符是一个辅音或没有,但问题是它告诉我它的一个辅音只有当我输入“b”时,如果我输入该数组中的其他元素,它会告诉我“不是辅音”。我不知道如何解决这个问题,我认为问题是,如果(* z == arr [y]),例如“c”是数组中的第二个元素,因为y = 0,程序会检查它是否是“b”,然后y = 1并且应该检查“c”,但程序检查“b”,然后进入“else”并告诉我它不是辅音,那么程序结束。

我对如何使这项工作没有想法。

+0

'为(Y == 0; Y <= 20; Y ++)'? 'y == 0'好像是一个错字? –

+0

我还建议您阅读Eric Lippert的[如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/),并学习如何使用调试器逐行执行程序。因为如果你这样做的问题应该变得非常明显。 –

+0

我不太明白你在说什么,如果你在谈论“int y = 0;”,如果它只是“int y;”,我会遇到同样的问题。 – petxd

回答

0

您的程序在技术上和逻辑上都有几个问题。

技术问题

如果您使用的是C++,避免使用已取代C++的功能C功能的,即dont't使用C字符串时,你可以使用C++ std::string

如果你有使用C数组的愿望,那么做它,但是std::vector将是更好的选择。

下一个问题是你for -loop。了解=(转让)和==(相等)之间的差异。 y==0是返回的表达式truey等于0,false否则。 y=0 assignes y0。在你的for -loop你想要做后者。

逻辑问题

问问自己,你想要达到什么样的?以下是您正在尝试执行的操作:

  1. 获取用户输入的字符。
  2. 检查这个字符是否是辅音。
  3. 输出相应的信息。

你的代码是从1点设计不当的:你为什么让用户输入一个字符串,如果你只在字符interessted(因为你正在测试,如果该字符串的长度为1,并希望将其与一个字符数组)?

这里出现了您最大的逻辑问题:在每个循环步骤中,您测试输入是否等于一个字符。如果不是,则输出“Not a consonant”并退出循环。让我们探讨的h输入:

  • 第一循环的执行:是h等于b? - >否 - >“没有辅音”和环

考虑使用此方法是avoides使用的C函数和解决您的问题离开:

编辑:既然你有问题,编译我的解决方案,我加不使用C++ 11个特征的版本:

C++ 11

#include <iostream> /* std::cout, std::cin */ 
#include <vector> /* std::vector */ 

int main() 
{ 
    std::vector<char> consonants {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 
            'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 
            'x', 'y', 'z'}; 
    char c; 

    std::cin >> c; 

    for(const auto& letter: consonants){ 
     if(c == letter){ 
      std::cout << "Consonant" << std::endl; 
      return 0; 
     } 
    } 

    std::cout << "Not a consonant" << std::endl; 
} 

编译与-std=c++11标志。

古典溶液

#include <iostream> /* std::cout, std::cin */ 
#include <vector> /* std::vector */ 

int main() 
{ 
    const char arr[] = {'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 
         'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 
         'x', 'y', 'z'}; 

    std::vector<char> consonants(arr, arr+sizeof(arr)/sizeof(arr[0])); 

    char c; 

    std::cin >> c; 

    for(int i=0;i<consonants.size();i++){ 
     if(c == consonants[i]){ 
      std::cout << "Consonant" << std::endl; 
      return 0; 
     } 
    } 

    std::cout << "Not a consonant" << std::endl; 
} 
+0

“无法转换”{'b','c','d','f','g','h','j','k','l','m','n' ,'p','q','r','s','t','v','w','x','y','z'}'从<大括号封闭的初始化列表>到'vector '“ - error – petxd

+0

用'g ++ -std = C++ 11编译yoursource.cpp'或者参见[用硬编码元素初始化std :: vector的最简单方法是什么?](https:// stackoverflow .com/questions/2236197/what-is-the-easiest-way-to-initialize-a-stdvector-with-hardcoded-elements)了解更多信息。 – datell