2016-02-13 4 views
0

Как использовать массив char в инструкции switch?с использованием массива char для оператора switch

Если бы я сделать это таким образом,

switch (argv[i]) { 
    case '-': ..... 
    default: ...... 
} 

Я получаю сообщение об ошибке:

switch quantity not an integer.

+1

Обеспечить более подробно – chux

+0

дела хорошо, потому что это тип символа, который вы можете использовать в переключателе ... Я предполагаю, что ваш ARGV является ARGV обычно передается в main, который представляет собой массив строк или '** char' ... вы не можете сделать:' switch (char *) 'это просто способ структурирования языка ... если вы работаете над разбором argv для обычных переключателей, вы должны посмотреть 'man 3 getopt' –

ответ

1

В коммутаторе, выражение должно быть от "интегрального типа"

сделать набор if/else вместо переключателя.

+0

Выражение« должно иметь целочисленный тип ». Вопрос отмечен C, а C не имеет типов классов или карт. –

+0

@KeithThompson Спасибо за ваш комментарий, я изменил свой ответ – alway5dotcom

+0

Это не поможет, если вы не предоставите образец кода –

0

Вы не можете этого сделать.

argv[i] - это адрес памяти, номер, это не строка и не может быть неявно по сравнению с другой «строкой» (либо литералом массива символов). С помощью инструкции switch можно сравнить только интегральный тип. Вы можете использовать специальный символ внутри этого «строка»:

switch(argv[i][0]){ 
case '-': ..... 
default: ...... 
} 

, но это, вероятно, не то, что вы хотите ...

Прямой вперед решение использовать группу if() ... else if() ... утверждений:

if(!strcmp(argv[i], "-")) { 
//... 
} else if(!strcmp(argv[i], "some other value")) { 
//... 
} else { 
// non of these... 
} 
+0

"' argv [i] '- адрес памяти" ... right ... ", номер " -- Неа. Адрес не является числом. И я не уверен, что вы подразумеваете под «сопоставимой строкой». Выражение в выражении 'switch' должно быть целочисленного типа. –

+0

@KeithThompson адрес материализован как число. Например, он может быть присвоен целочисленному типу. Часть «сравнимой струны» действительно запутывает. Я буду перефразировать ... – Amit

+0

Нет, адрес не может быть свободно назначен целочисленному типу. Он может (или не иметь) иметь аналогичное представление и может быть преобразован с явным приведением, но язык делает сильное различие между указателями и числами. –

0

Согласно С11:

6.8.4.2 The switch statement

1 The controlling expression of a switch statement shall have integer type.

Так, к сожалению, один никогда не может нас e нецелых типов в инструкции switch.

Также, argv[1] - это действительно char*. Это легко понять, потому что int main(int argc, char *argv[]) просто эквивалентна int main(int argc, char **argv)

+0

'argv [I]' это 'char *', а не массив. –

+0

@KeithThompson Отвечено обновлено –

Смежные вопросы