Пропуск инициализации из за метки case c

Где огромная разница, которая генерирует ошибку C2360, в следующих двух определениях?

Решение

Первое законно, а второе нет. Иногда допускается пропуск объявления без инициализатора, но никогда без объявления с инициализатором.

int main()
<
setlocale(LC_ALL, "RUS");
int punkt;
printf_s("1.Длина строки
2.Копирование строки
3.Соединение строк
4.Сравнение строк
5.Преобразование строки в нижний регистр
6.Преобразование строки в верхний регистр
7.Первое вхождение символа в строку
8.Вхождение подстроки в строку
9.Удаление символов строки
10.Раздвигание одной строки и помещение в нее другой
11.Удаление четных переворот нечетных слов
12.Выход
");
while (1)
<
scanf_s("%d", &punkt);
switch (punkt)
<
case 1:
char s[256];
printf_s("vvedite stroky
");
gets_s(s);
int k = mystrlen(s);
printf_s("%d
", k); break;

case 2:
char s[200];
char s1[200];
printf_s("vvedite stroky s
");
gets_s(s);
printf_s("vvedite stroky s1
");
gets_s(s1);
char *p = mycopy(s, s1);
puts(p); break;

case 3:
char str1[40], str2[20];
printf_s("vvedite stroky s
");
gets_s(str1);
printf_s("vvedite stroky s1
");
gets_s(str2);
mystrcat(str2, str1);
puts(str2); break;

case 4:
char a[200];
char b[200];
printf_s("vvedite stroky a
");
gets_s(a);
printf_s("vvedite stroky b
");
gets_s(b);
char c = mystrdcmp(a, b);
printf_s("%d
", c);break;

case 5:
char str[200];
printf_s("vvedite sroky
");
gets_s(str);
for (int i = 0; str[i] != ‘’; i++)
str[i] = mytolower(str[i]);
puts(str); break;

case 6:
char str[200];
printf_s("vvedite sroky
");
gets_s(str);
for (int i = 0; str[i] != ‘’; i++)
str[i] = mytoupper(str[i]);
puts(str); break;

case 7:
char str[200];
printf_s("vvedite sroky
");
gets_s(str);
char a;
printf_s("vvedite simvol
");
scanf_s("%c", &a);
char *v;
v = mystrchr(str, a);
if (v)
puts(v);
else
printf_s("simvol ne nayden
"); break;

case 8:
char s[200];
printf_s("vvedite stoky 1
");
gets_s(s);
char s1[200];
printf_s("vvedite stroky 2
");
gets_s(s1);
char *v = mystrstr(s, s1);
if (v)
puts(v);
else
printf_s("vxojdenie stroki ne naydeno
"); break;

Читайте также  После обновления windows 10 не работают приложения

case 9:
char s[200];
printf_s("vvedite stroky
");
gets_s(s);
int p; int k;
printf_s("vvedite nomer poziczii ydalenia
");
scanf_s("%d", &p);
printf_s("vvedite colichestvo ydalyaemix simvolov
");
scanf_s("%d", &k);
char*v = mystrsub(s, p, k);
puts(v); break;

Никак не могу понять, в чём ошибка в коде. Например, если я пишу вот так:

То всё работает пркрасно, но, если я напишу:

То получуошибку вида:

Вопрос, что не так? Ведь по сути, я просто переношу инициализацую файловой переменной изнутри case наружу?

1 ответ 1

Дело в том что в С++ конструкция switch / case является замаскированным goto и case блоки не создают области видимости. У вас происходит примерно вот это:

Соответственно для каждого case следует вручную создавать новую область видимости:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ visual-c++ или задайте свой вопрос.

Связанные

Похожие

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.12.20.35703

Ссылка на основную публикацию
Adblock
detector