2015-08-22 6 views
1

Может кто-то помочь. Я новичок в программировании и курсе cs50. Задача состоит в том, чтобы скремблировать простой текст на основе кодового слова. Язык C и linux.Уровень начального уровня. Кодирование в C. Проблемы с "if else".

Кажется, что все это работает, но я ударяю головой в течение последних 2 часов, пытаясь исправить последнюю ошибку при компиляции программы. Проблема, которую я имею в нижней половине программы (после // Cipher FUNTION бит)

Это ошибка:

viginere.c:39:5: error: expected expression 
else 
^ 
viginere.c:44:5: error: expected expression 
else 
^ 
2 errors generated. 

Я не могу видеть, что я сделал неправильно с этим.

Я столкнулся с {} в нескольких разных местах, но я не думаю, что это проблема, так как эта программа является модифицированной версией программы, которую я сделал раньше, и что она работает с той же компоновкой (только с другой немного другой printf) Что мне не хватает?

Heres мой код:

int main (int argc, string argv[]) 
{ 
//change command line string to a number 
int k = atoi(argv[1]); 
string v = argv[1]; 

//check program command line was typed correctly 
if (argc != 2 || k != 0) 
    { 
    printf("Restart program with keyword in command line (alphabetical characters only)\n"); 
    return 1; 
    } 

//Get Plain Text 
printf("The keyword is set to %s.\nType in your plain text: ", argv[1]); 
string s = GetString(); 

//Print Cipher 
printf("Your cipher text = "); 

//Set variables for mudulo on keyword 
int codecount = strlen(argv[1]); 
int c = 0; 

//Cipher function (Errors are in this part) 
for (int i = 0; i < strlen(s); i++) 
    { 
    //Cipher uppercase 
    if (isupper(s[i])) 
    printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65); 
    c++; 
    //Else Cipher lowercase 
    else 
    if (islower(s[i])) 
    printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97); 
    c++; 
    //Print all else as normal 
    else 
    printf("%c", s[i]); 
    } 
printf("\n");  
}  
+5

Вам нужны скобки вокруг нескольких операторов после того, как 'if' для' else' будет действительным. Кроме того, Вигенер, вероятно, превращается в могилу, когда его имя ошибочно написано. –

+0

Вам не хватает скобок для операторов if + else в вашем цикле for –

+0

Спасибо большое, ребята, мне удалось заставить это работать в результате. Также изменилось имя файла на Vigenere .... – Vince

ответ

1

Используйте фигурные скобки ...

Когда есть более чем одна линия должна быть выполнена в результате if(condition), каждый должен быть инкапсулируется в фигурные скобки.

if(condition) 
{ 
    statement1(); 
    statement2();//without brackets this would not be executed 
} 

Точно так же, если есть несколько строк, которые должны быть выполнены тогда и только тогда, когда if(condition) ложно, они также должны быть окружены фигурными скобками, начиная после else ключевого слова.

... 
else 
{ 
    statement3(); 
    statement4();//without brackets, this would not be executed 
} 

Есть разные мнения, если curlys следует использовать только для одной линии после if и else, но readability, maintainability and reliability достаточно использовать фигурные скобки религиозно причины.

5

Если if или else блок имеет более одного оператора нужно поставить фигурные скобки вокруг них. Чтобы быть в безопасности, многие программисты будут постоянно включать фигурные скобки.

//Cipher uppercase 
if (isupper(s[i])) { 
    printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65); 
    c++; 
} 
//Else Cipher lowercase 
else if (islower(s[i])) { 
    printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97); 
    c++; 
} 
//Print all else as normal 
else { 
    printf("%c", s[i]); 
} 
2

Вы упускаете { } вокруг тела вашего if. Если вы не поместите фигурные скобки вокруг тела, это просто следующее утверждение. Поскольку ваш else не сразу после этого утверждения, он не распознается как совпадение с if.

if (isupper(s[i])) { 
    printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65); 
    c++; 
} 
//Else Cipher lowercase 
else if (islower(s[i])) { 
    printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97); 
    c++; 
} 
//Print all else as normal 
else { 
    printf("%c", s[i]); 
} 

Даже если у вас есть только одно заявление в теле, я рекомендую вам всегда накладывать на него фигурные скобки. См Why is it considered a bad practice to omit curly braces?

+0

«Всегда подтяжки» - это вопрос мнения; Я, например, не согласен. Но тогда я тоже не согласен с OTBS. –

+0

@JonathanLeffler Если вы настолько умны, что всегда помните, чтобы добавить фигурные скобки, когда вы добавляете второе утверждение в тело, все силы для вас. Большинство людей ошибаются, и всегда помогает избежать этого. – Barmar

+0

@JonathanLeffler Я изменил свой ответ, указав, что это мое мнение, а не абсолютное. Счастливый? – Barmar

2

Вы должны фигурные скобки вокруг нескольких операторов после if для else быть действительной:

int len = strlen(s); 
for (int i = 0; i < len; i++) 
{ 
    //Cipher uppercase 
    if (isupper(s[i])) 
    { 
     printf("%c", (s[i] + v[c%codecount] - 65)%26 + 65); 
     c++; 
    } 
    //Else Cipher lowercase 
    else if (islower(s[i])) 
    { 
     printf("%c", (s[i] + v[c%codecount] - 97)%26 + 97); 
     c++; 
    } 
    //Print all else as normal 
    else 
     printf("%c", s[i]); 
    printf("\n"); 
} 

Есть те, кто хотел бы использовать фигурные скобки каждый раз. Я считаю, что это не обязательно, но это безвредно и может помочь вам, особенно, возможно, пока вы учитесь.

В качестве альтернативы, в этом варианте кода, вы могли бы избежать отдельные заявления, используя приращение в printf() вызовов:

int len = strlen(s); 
for (int i = 0; i < len; i++) 
{ 
    if (isupper(s[i]))   // Cipher uppercase 
     printf("%c", (s[i] + v[c++ % codecount] - 'A') % 26 + 'A'); 
    else if (islower(s[i])) // Cipher lowercase 
     printf("%c", (s[i] + v[c++ % codecount] - 'a') % 26 + 'a'); 
    else      // Non-alphabetic 
     printf("%c", s[i]); 
} 
printf("\n"); 

Эта версия также использует 'A' вместо 65 и 'a' вместо 97; это облегчает людям понимание. Этот метод сжатия не всегда будет работать, и его следует использовать с осторожностью, даже если он работает, но его можно использовать в этом коде. Он также печатает только строку новой строки в конце строки (или если в строке есть строки новой строки), вместо того, чтобы помещать каждого символа в свою строку.

В обоих приведенных вариантах также избегать использования strlen(s) в условиях цикла; это плохо для производительности, в конечном счете, хотя вам нужно будет шифровать длинные сообщения, прежде чем они станут измеримыми.Можно также утверждать, что код должен использовать putchar(char_value) вместо printf("%c", char_value). Тем не менее, это вряд ли будет иметь измеримые выгоды от кода для данных, участвующих в упражнении учащегося, но оба изменения могут быть значительными, если вы многократно работаете над мегабайтами данных.

2

Проблема в том, что у вас слишком много заявлений между if и вашим else!

Чтобы использовать if...else, вам необходимо создать блок или дать один оператор. На самом деле это одно и то же. Иными словами:

if(x==1) do_this(); 
else do_that(); 

Это будет работать. Но что более типично (и что вам нужно) - создать «Блок»:

if(x==1) { 
    do_this(); 
    and_that(); 
} else { do_some_other_things(); } 

Надеюсь, что это поможет!

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