У меня есть следующий код:

#include <stdio.h>
#define WHITE_SPACE 0
#define NOT_WHITE_SPACE 1

void main() {

    char c;
    int code;

    printf("Please give a character: ");
    scanf("%c", &c);

    if (c== " " ||  c== "\n" || c== "\t")
            code = WHITE_SPACE;
    else:
            code = NOT_WHITE_SPACE;
    }

    printf("%d\n", code);

}

Я хочу преобразовать оператор if-else в switch.

Когда я пытаюсь case " " или case "\n" или case "\t", я получаю error case label does not reduce to an integer constant. Вы знаете, как это исправить?

c
1
zinon 8 Окт 2018 в 12:52

2 ответа

Лучший ответ

Буквальная строка, например, например " " на самом деле является массивом символов (только для чтения). Как и другие массивы, он распадается до указателя на свой первый элемент. Это означает, что c == " " сравнивает символ в c с указателем с первым символом " ".

Чтобы получить буквальный символ, используйте одинарные кавычки, как в ' ':

if (c== ' ' ||  c== '\n' || c== '\t')

Теперь, когда вы знаете, как использовать буквенные символы, вы можете использовать их внутри switch для своих ярлыков case.

Но, конечно, не изобретайте велосипед, используйте стандартный {{X0} } вместо этого:

if (isspace(c))
4
Some programmer dude 8 Окт 2018 в 10:01

Начнем с того, что исходный код, который вы опубликовали, не работает, он недействителен C.

Операторы switch работают только с целыми числами, поэтому вы должны использовать правильные символьные константы, такие как ' '. А не строковые литералы " ". Пример:

switch(ch)
{
  case ' ':
  case '\n':
  case '\t':
    puts("whitespace");
  break;

  default:
    puts("not whitespace");
}

При этом нет необходимости раскатывать подобные вещи вручную. #include <ctype.h> вместо этого вызовите функцию isspace.

5
Lundin 8 Окт 2018 в 09:56