我使用什么函数在cin语句中存储单个字符,以便可以单独处理每个字符?

时间:2019-03-15 04:30:32

标签: c++

我正在开发一个程序,假设该程序要求用户输入单词,然后将其翻译为CIAO。但是,当我的程序编译时,它只会将第一个字母处理到switch语句中的次数是单词长度的倍数。我要使用什么功能?

#include<iostream>
using namespace std;

int main()                                                                  
{                                                                           
    //Identify Variables                                                    
    string word;                                                            
    int counter;                                                            
    char letters, word1, word3;                                             

    //Ask user to input a word to be translated into I.C.A.O                
    cout<<" Enter a word: ";                                                
    cin>>word;                                                              

    counter = word.length(); //Counts the number of characters the user inputed
    word1 = word[0]; //Converts a string to a char value                 

    //Use a while statement to repeat until there are zero letters to process
    while(counter != 0)                                                     
    {                                                                       
        //Use a switch statement to translate each letter into I.C.A.O      
        switch(word1)                                                       
        {                                                                   
            case 'a': case 'A': cout<<"Alpha\n"; break;                     
            case 'b': case 'B': cout<<"Bravo\n"; break;                     
            case 'c': case 'C': cout<<"Charlie\n"; break;                   
            case 'd': case 'D': cout<<"Delta\n"; break;                     
            case 'e': case 'E': cout<<"Echo\n"; break;                      
            case 'f': case 'F': cout<<"Foxtrot\n"; break;                   
            case 'g': case 'G': cout<<"Golf\n"; break;                      
            case 'h': case 'H': cout<<"Hotel\n"; break;                     
            case 'i': case 'I': cout<<"India\n"; break;                     
            case 'j': case 'J': cout<<"Juliet\n"; break;                    
            case 'k': case 'K': cout<<"Kilo\n"; break;                      
            case 'l': case 'L': cout<<"Lima\n"; break;                      
            case 'm': case 'M': cout<<"Mike\n"; break;                      
            case 'n': case 'N': cout<<"November\n"; break;                  
            case 'o': case 'O': cout<<"Oscar\n"; break;                     
            case 'p': case 'P': cout<<"Papa\n"; break;                      
            case 'q': case 'Q': cout<<"Quebec\n"; break;                    
            case 'r': case 'R': cout<<"Romeo\n"; break;                     
            case 's': case 'S': cout<<"Sierra\n"; break;                    
            case 't': case 'T': cout<<"Tango\n"; break;                     
            case 'u': case 'U': cout<<"Uniform\n"; break;                   
            case 'v': case 'V': cout<<"Victor\n"; break;                    
            case 'w': case 'W': cout<<"Whiskey\n"; break;                   
            case 'x': case 'X': cout<<"X-Ray\n"; break;                     
            case 'y': case 'Y': cout<<"Yankee\n"; break;                    
            case 'z': case 'Z': cout<<"Zulu\n"; break;                      
        }                                                                   

        counter--;                                                          
    }                                                                       

    return 0;                                                               
}

2 个答案:

答案 0 :(得分:2)

您永远不会在循环中修改word1,所以switch语句将始终选择字母第一个字母,并在循环之前对其进行初始化。

正确的方法是遍历单词中的字符,如下所示:

for (char c : word)
{                                                                       
    switch (c) {
        //...
    }
}

如果使用的编译器不支持C ++ 11功能,例如基于范围的循环(如上使用),则可以使用oldskool:

for (size_t i = 0; i < word.size(); i++) {
    switch(word[i]) ...
}

或者:

for (std::string::const_iterator it = word.cbegin(); it != word.cend(); it++) {
    switch(*it) ...
}

答案 1 :(得分:0)

如果您实际上仅受#include <iostream>的限制,那么就不能使用string(需要#include <string>),并且会使用旧的字符数组。在这种情况下,这不是缺点,实际上更容易。

您不想使用 magic-numbers ,因此请声明一个足够大的常量,以调整数组大小,以允许您在不占用空间的情况下读取单词。非医学未删节词典中最长的单词为29个字符(因此,无终止字符的+1总共需要30个字符)。由于您从不跳过缓冲区大小!,因此256就足够了,例如

#define MAXC 256
...
    char word[MAXC];

现在,您所做的全部工作就是将stdinword读入cin >> word。但是,您确实应该 Validate 读取成功,并且用户没有在Linux上使用 Ctrl + d 取消(或在windoze中使用 Ctrl + z 取消) ),例如

    //Ask user to input a word to be translated into I.C.A.O
    cout << " Enter a word: ";
    if (!(cin >> word)) {
        cerr << "(user canceled input)\n";
        return 1;
    }

现在,只需循环word中的字符即可。您可以使用指针或for循环和数组索引,例如

    for (i = 0; word[i]; i++)
    {
        //Use a switch statement to translate each letter into I.C.A.O
        switch (word[i])
        {
            case 'a': case 'A': cout<<"Alpha\n"; break;
            case 'b': case 'B': cout<<"Bravo\n"; break;
            case 'c': case 'C': cout<<"Charlie\n"; break;
            ...

完全将其放入,您可以这样做:

#include<iostream>

#define MAXC 256

using namespace std;

int main (void)
{
    //Identify Variables
    char word[MAXC];
    int i;

    //Ask user to input a word to be translated into I.C.A.O
    cout << " Enter a word: ";
    if (!(cin >> word)) {
        cerr << "(user canceled input)\n";
        return 1;
    }

    /* Use a for loop to iterate over each character in word */
    for (i = 0; word[i]; i++)
    {
        //Use a switch statement to translate each letter into I.C.A.O
        switch (word[i])
        {
            case 'a': case 'A': cout<<"Alpha\n"; break;
            case 'b': case 'B': cout<<"Bravo\n"; break;
            case 'c': case 'C': cout<<"Charlie\n"; break;
            case 'd': case 'D': cout<<"Delta\n"; break;
            case 'e': case 'E': cout<<"Echo\n"; break;
            case 'f': case 'F': cout<<"Foxtrot\n"; break;
            case 'g': case 'G': cout<<"Golf\n"; break;
            case 'h': case 'H': cout<<"Hotel\n"; break;
            case 'i': case 'I': cout<<"India\n"; break;
            case 'j': case 'J': cout<<"Juliet\n"; break;
            case 'k': case 'K': cout<<"Kilo\n"; break;
            case 'l': case 'L': cout<<"Lima\n"; break;
            case 'm': case 'M': cout<<"Mike\n"; break;
            case 'n': case 'N': cout<<"November\n"; break;
            case 'o': case 'O': cout<<"Oscar\n"; break;
            case 'p': case 'P': cout<<"Papa\n"; break;
            case 'q': case 'Q': cout<<"Quebec\n"; break;
            case 'r': case 'R': cout<<"Romeo\n"; break;
            case 's': case 'S': cout<<"Sierra\n"; break;
            case 't': case 'T': cout<<"Tango\n"; break;
            case 'u': case 'U': cout<<"Uniform\n"; break;
            case 'v': case 'V': cout<<"Victor\n"; break;
            case 'w': case 'W': cout<<"Whiskey\n"; break;
            case 'x': case 'X': cout<<"X-Ray\n"; break;
            case 'y': case 'Y': cout<<"Yankee\n"; break;
            case 'z': case 'Z': cout<<"Zulu\n"; break;
        }
    }

    return 0;
}

使用/输出示例

$ ./bin/char_switch
 Enter a word: abcdefg
Alpha
Bravo
Charlie
Delta
Echo
Foxtrot
Golf

仔细检查一下,如果还有其他问题,请告诉我。

允许#include <string>

使用string word而不是char word[256],代码实际上是相同的。唯一需要做的更改是删除#define MAXC 256行,然后:

#include <string>
...
    string word;

代码的其余部分可以完全相同,因为您可以用与索引C字符数组相同的方式来索引C ++ string。您还可以使用我们在注释中详细讨论的所有其他形式的C ++循环。如果您想要使用它们的示例,我很乐意添加它们,让我知道。

但是,您可能应该使用适当的string::iterator来将字符从word.begin()循环到word.end()之前的字符,这是做同一件事的另一种方法。这就是:

    for (string::iterator c = word.begin(); c != word.end(); c++) 
    {
        //Use a switch statement to translate each letter into I.C.A.O
        switch (*c)
        {
            case 'a': case 'A': cout<<"Alpha\n"; break;
            case 'b': case 'B': cout<<"Bravo\n"; break;
            case 'c': case 'C': cout<<"Charlie\n"; break;
            ...

迭代器实际上是指向容器成员的指针(wordstring中的字符),因此这就是为什么在{{1 }}传递迭代器(字符)指向的内容,而不是迭代器本身(指向该字符的指针)。

(如果走这条路,别忘了删除*c声明-不再需要)