我正在开发一个程序,假设该程序要求用户输入单词,然后将其翻译为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;
}
答案 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];
现在,您所做的全部工作就是将stdin
从word
读入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;
...
迭代器实际上是指向容器成员的指针(word
中string
中的字符),因此这就是为什么在{{1 }}传递迭代器(字符)指向的内容,而不是迭代器本身(指向该字符的指针)。
(如果走这条路,别忘了删除*c
声明-不再需要)