#c #effect #rot13
#c #эффект #rot13
Вопрос:
Эта программа предназначена для применения rot13 для ввода. Однако при компиляции я получаю предупреждения о том, что строки 20, 23, 29 не имеют эффекта в коде, а строка 17 является недоступным кодом. Когда что-либо вводится, это просто продолжает работу программы и оставляет пустое место. Что не так?
int main()
{
int c;
while ( ( c = getchar() ) != EOF )
putchar( r13( c ) );
return 0;
}
int r13(int c)
{
if(( tolower( c ) >='a' amp;amp; c <='z'))
{
if((c) < 'm')
(c = c 13);
else
{
(c = c - 13);
}
}
else
c = c;
return ( isalpha( c ) );
}
РЕДАКТИРОВАТЬ: я тупо поместил туда return, не заметив, что исправляет ошибку unreachable. Но я все еще понятия не имею, почему c 13 и c-13 не имеют эффекта?
РЕДАКТИРОВАТЬ: Я хотел создать программу на C, которая представляла бы собой кодировщик / декодер rot13. Это исходный код, и он отлично работает. Однако я хотел перейти на модульный дизайн, и недостаток знаний привел меня к неудаче. Надеюсь, это поможет людям понять, что я пытаюсь сделать.
int main(void)
{
int c,e;
while((c=getchar())!=EOF)
{
if(c >='A' amp;amp; c <='Z')
{
if((e = c ROT) <= 'Z')
putchar(e);
else
{
e = c - ROT;
putchar(e);
}
}
else if(c >='a' amp;amp; c <='z')
{
if((e= c ROT) <= 'z')
putchar(e);
else
{
e = c - ROT;
putchar(e);
}
}
else
putchar(c);
}
return 0;
}
РЕДАКТИРОВАТЬ: ок, наконец, исправил это, так много глупых ошибок, спасибо за помощь. Также программа должна спросить пользователя, желает ли он ввести другое значение, и, если да, повторить процесс. Есть так много способов сделать это, просто интересно, что вы, ребята, считаете лучшим способом сделать это.
Комментарии:
1. действительно ли эти инструкции что-либо делают,
(c 13);
,(c - 13);
иc;
. Я мало что знаю о c, но в c # они бессмысленны.
Ответ №1:
Да, они не имеют эффекта. Трудно догадаться, что вы имели в виду, но вы просто пропустили return
ключевые слова перед ними?
Ответ №2:
Вам нужно c = c 13;
или c = c - 13;
изменить значение c. Чтобы вернуть значение c, вам нужно return c;
Ответ №3:
Что вы ожидаете (c 13);
сделать? Это просто вычисляет…но ничего не делает. Он не будет изменен c
. Для изменения, c
чтобы оно содержало значение, c 13
которое вам нужно записать c = c 13;
, имейте в виду, что вы объявили c как «int», а не «char».
Кроме того, что случилось с else
c;
Что это должно делать?
Я думаю, вам было бы полезно изучить основы программирования. В частности, =
является оператором присваивания. Способ, которым это работает, заключается в том, что выражение справа от =
«присваивается» переменной (или const) слева. Итак, чтобы увеличить c на 13, вам нужно было бы написать c = c 13;
This evaluates c 13
, а затем вставить это значение внутрь c
.
Другая ключевая концепция находится return
внутри функций. Возврат значения завершает работу функции и предоставляет это значение тому, что вызывало функцию. Помните, что компьютер выполняет все последовательно, поэтому, если вы вставите оператор return в начало своей функции, остальной код выполняться не будет.
Ответ №4:
вы перенастраиваете перед if()
int r13(int c)
{
return ( isalpha( c ) ); //put it last line of your function
if(( tolower( c ) >='a' amp;amp; c <='z')) //this will be unreachable
.....
}
Объяснение:
return
инструкция отправит обратно поток управления без выполнения кода, приведенного ниже return
инструкции, при вызове вашей r13(int c)
функции.
Ответ №5:
Ваш код является… странно… Любой код после строки 13 не может быть достигнут при возврате isalpha(c)
. Компилятор прав.
Вам также следует уделять больше внимания эстетике кода (некрасивый код может привести к такого рода ошибкам).
Ответ №6:
Оператор return в начале вашей функции r13 фактически превращает весь остальной код в функции в «мертвый код».