我如何使用 switch 而不是 if else 来做到这一点?

How do I do this with switch instead of if esle?

我正在上我的第一门编程课程,作业是使用 switch 语句重做之前的程序(这个)。我以为switch只是用来比较单个字符的

该程序基本上只接收一个字符串并计算数字、字母、其他字符和总字符数.....

#include <iostream> 
using namespace std;

int main()
{
    char s[50];
    int i;
    int total = 0;
    int letters = 0;
    int numbers = 0;
    int others = 0;    

    cout << "Enter a continuous string of characters with no blank spaces" << endl;
    cout << "(example: aBc1234!@#$%)" << endl << endl;
    cout << "Enter your string: ";
    cin >> s;
    cout << endl;

    i = 0;
    while (s[i] != 0)
    {
        if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z'))
            letters++;
        else if ((s[i] >= '0' && s[i] <= '9'))
            numbers++;
        else
            others++;
        i++;
        total++;
    }

    cout << letters << " letters" << endl;
    cout << numbers << " numbers" << endl;
    cout << others << " other characters" << endl;


    return 0;
}

你不应该。 switch 语句基于 ==,而不是 <= / >= / < / >.

switch语句中的case必须是常量表达式。您必须为每个字符制作一个单独的 case

有些情况下 switch 是更好的解决方案。但这不是其中一种情况。这里 ifelse 是要走的路。

switch(s[i]) {
    case '0':
    ...
    case '9': numbers++; break;
    default: {
        switch(toupper(s[i])) {
            case 'A':
            case 'B':
            ...
            case 'Z': letters++; break;
            default: others++;
        }
     }
}    

在这种特殊情况下,if/else 是最好的方法(如@zenith 所说),但如果你想用 switch 语句来做,你会做

switch(s[i])
{
    case `0`:
    case '1':
    case '2':
    //repeat for '3'-'8'
    case '9':
        //do whatever you want when it is a digit here
        break;
    case 'A':
    case 'a':
    case 'B':
    case 'b':
    //repeat for 'C'-'y'
    case 'Z':
    case 'z':
        //do whatever you want when it is a letter
        break;
    default:
        //do whatever you want when it was not a letter or a digit
        break;
}

caseswitch 语句中匹配时,会执行相应 break 之前的所有内容 - 这就是您可以像这样对案例进行分组的方式

您需要从所有感兴趣的角色到行为的映射。

enum char_category { OTHER, LETTER, NUMBER };
unsigned char mapping[256];

memset(mapping, OTHER, sizeof mapping);

for( char ch = '0'; ch <= '9'; ++ch ) mapping[ch] = NUMBER;
for( char ch = 'A'; ch <= 'Z'; ++ch ) mapping[ch] = mapping[tolower(ch)] = LETTER;

那你可以使用跳转table:

switch ( mapping[s[i]] )
{
    case NUMBER:
        break;
    case LETTER:
        break;
    case OTHER:
        break;
}

或者您可以完全跳过条件:

int count[3] = { 0, 0, 0 };

count[mapping[s[i]]]++;

letters = count[LETTER];
numbers = count[NUMBER];
other = count[OTHER];

请注意,只有当您输入的字符超过几十个时,设置映射的工作才合理。