2016-11-29 4 views
0

Я хочу сделать программу, которая берет буквы и использует шифрование Цезаря, чтобы сдвинуть их от значения до 1 до b. Для этого он должен использовать строку.C-язык - программа шифрования Цезаря

Моя проблема заключается в том, что моя программа не будет вводить вход пользователя в строку. (Я попытался поместить парня [10] в scanf, но это только вызвало сбой программы - поэтому я охотно помещал туда неправильного парня, чтобы программа могла скомпилировать).

#include <stdio.h> 


int main(){ 
int i=0; //setting the individual slot number for the array-- later used in the while loop 
char guy[10]; 
printf("Enter Plain Text:"); 
scanf("%s",&guy); //takes user's input-- such as "abc" and puts it into its respective slot in the array guy[10] r-right? 

while (guy[10] != '\0'){ //while loop that runs until it reaches the end of the string 
    if ((guy[i]) >= 'A' && (guy[i]<= 'Z')){ //moves capital letter values up 1 
     guy[i]=guy[i]++; //makes the current "slot" number go up 1 value. Example: a = 97 + 1 -> b = 98 
     } 
    if ((guy[i]) >= 'a' && (guy[i]) <= 'z'){// moves lower case letter values up 1 
     guy[i]=guy[i]++; 
    } 
    i++; //moves the array's interval up to the next "slot" 

} 
printf("Encrypted text is: %s",guy); 
} 
+0

Fyi, там только так много способов разумно внедрить цезарные шифры в C, а '[c] Caesar' в окне поиска этого сайта даст более сотни из них. Что касается вашего кода. 'guy [i]', а не 'guy [10]', должен быть в вашем выражении while-condition. И 'guy', а не' & guy', должен быть параметром, переданным в 'scanf'. – WhozCraig

+0

, хотя это верно, ни один из них не слишком глубоко охватывает C-язык –

ответ

0

Ваш первый вопрос эта строка:

scanf("%s",&guy); 

, как guy массив таким образом, мы не должны получить указатель на него, это название трактуется как указатель в этом контексте. Просто сделать:

(void) scanf("%s", guy); 

Ваш второй вопрос эта строка:

while (guy[10] != '\0') 

, как WhozCraig отметил ИНТ его комментарий - это должно использовать индекс i, не 10

Третий вопрос заключается в том, что это не имеет смысла:

guy[i]=guy[i]++; 

Rea альтернативные варианты использования:

guy[i] = guy[i] + 1; 
guy[i]++; 
guy[i] += 1; 

Четвертый вопрос: вы не имеете дело с оберткой. Например. что означает «Z» в вашем коде? Похоже, что это выйдет как «[» вместо «А».

Пятая проблема заключается в том, что scanf() может переполнять массив guy, так как размер ввода неограничен. Для guy[10], мы должны сделать что-то вроде:

scanf("%9s", guy); 

Чтобы ограничить ввод девяти символов с комнатой для окончательного «\ 0». Использование fgets() будет лучшим выбором в этой ситуации, как это безопаснее, и мы не нуждаемся в разборе силы scanf():

fgets(guy, 10, stdin); 

Вот переделки, затрагивающие эти пяти вопросов:

#include <stdio.h> 

int main() { 
    char text[10]; 

    printf("Enter Plain Text: "); 
    (void) fgets(text, 10, stdin); // takes user's input -- such as "abc" and put it into its respective slots in the array 

    int i = 0; // slot index for the array 

    while (text[i] != '\0') { // loop until reach end of string 

     if (text[i] >= 'A' && text[i] <= 'Z') { // move capital letter values up 1 
      // make the letter go up 1 modulo 26. Example: A = 65 + 1 -> B = 66; Z = 90 + 1 -> A = 65 
      text[i] = ((text[i] - 'A' + 1) % ('Z' - 'A' + 1)) + 'A'; 
     } else if (text[i] >= 'a' && text[i] <= 'z') { // move lower case letter values up 1 
      text[i] = ((text[i] - 'a' + 1) % ('z' - 'a' + 1)) + 'a'; 
     } 

     i++; // move the array's index up to the next "slot" 
    } 

    printf("Encrypted text is: %s\n", text); 
}