2015-07-27 3 views
0

Мне нужна помощь по поводу моего кода, у меня есть некоторые работы, и это одно из заданий.Файл на c-языке


Предположим, что зашифрованный файл был создан с использованием схемы кодирования/декодирования.

Каждая буква заменяется другой буквой в соответствии с данным отображением, как показано ниже.

char * letters = "abcdefghijklmnopqrstuvwxyz"; 

char * enc = "kngcadsxbvfhjtiumylzqropwe"; 

Например, каждый a становится k при кодировании текста, и каждый k становится a при декодировании.

Вы будете писать программу, кодировать или декодировать файл, а затем кодировать или декодировать файл, используя приведенное выше сопоставление.

Заглавные буквы отображаются так же, как буквы нижнего регистра выше, но остаются заглавными.

Например, каждое «A» становится «K» при кодировании файла, и каждый «K» становится «A» при декодировании.

Номера и другие символы не кодируются и остаются неизменными.

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

Запросить имя файла/имя файла ввода (зашифрованный файл). Шифрование с использованием вышеуказанного кодирования/декодирования.

Запросить зашифрованный файл и декодироваться в исходный файл ввода.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
int main() 
{ 
char letters[]={"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"}; 
char enlet[]={"kngcadsxbvfhjtiumylzqropweKNGCADSXBVFHJTIUMYLZQROPWE"}; 
char infile[20]; 
char outfile[20]; 
char ch; 
int i; 

FILE *org, * enc, *dec; 

printf("Enter file name (***.txt) : "); 
gets(infile); 

printf("Enter saving file name (***.txt) : "); 
gets(outfile); 

org = fopen(infile,"r"); 
enc = fopen(outfile,"w+"); 

while((ch=fgetc(org))!=EOF) 
{ 
    for(i=0;i<52;i++) 
    { 
     if(letters[i]==ch) 
     { 
      ch=enlet[i]; 
     } 
    }   
    fputc(ch,enc); 
} 
fclose(org); 
fclose(enc); 

return 0; 
} 

Этот код работает, но буквы не меняются правильно. Если в моем исходном файле есть «abcdefghijklmnopqrstuvwxyz», , тогда в кодированном файле происходит «felcadlpbrfhjeiqmwleqropwe».

Я ожидал, что это будет «kngcadsxbvfhjtiumylzqropwe» Я не знаю, какие ошибки в моем коде.

+1

Что вы сделали, чтобы попробовать и отладить его? Вы запустили программу в отладчике? Вы помещали отладочные заявления printf, чтобы попытаться понять, где все может пойти не так? Кроме того, что вы подразумеваете под «кодом работает»? Если он не делает то, что предполагается, то нельзя сказать, что он «работает». Или вы имеете в виду, что он работает с некоторыми входами, но не с другими? – kaylum

+1

Примечания: 1) 'char ch;' -> 'int ch;' для правильного выделения всех символов, прочитанных из 'EOF'. 2) Используйте 'fgets()' вместо 'gets()'. 3) проверить результаты 'fopen()'. – chux

+0

Просьба последовательно отступать от кода: предлагать отступ 4 пробела после каждой открывающей скобки '{' и отступать до каждой закрывающей скобки}. Это включает в себя скобки в начале и конце каждой функции. – user3629249

ответ

4

Ваш, если блок должен прочитать:

if (letters[i]==ch) 
{ 
    ch = enlet[i]; 
    break; 
} 

так что ch не заменяется дважды. I.e., в тот момент, когда вы знаете замену позиции входного файла, разрыва и перемещения.

+0

Право !! Спасибо большое – Han

2

В этом цикле вы перезаписываете ch после его замены.

while((ch=fgetc(org))!=EOF) 
{ 
    for(i=0;i<52;i++) 
    { 
     if(letters[i]==ch) 
     { 
      ch=enlet[i]; 
     } 
    }   
    fputc(ch,enc); 
} 

Вы можете сделать одну из двух вещей:

  1. Вместо назначения ч = enlet [я] просто сделайте fputch (enlet [I])

или

  1. Разрыв петли, как только вы нашли совпадение
0

Вы можете пропустить для() цикл и просто использовать:

if(org && enc) 
    while((ch=fgetc(org))!=EOF) 
    { 
    char *p = strchr(letters, ch); 
    fputc((p)?enlet[p-letters]:ch, enc); 
    } 

Кроме того, вы действительно должны объявить ч как межд сравнить его с EOF. И gets() - это переполнение буфера, которое должно произойти, и сбой вашей программы/обеспечить перехват взлома безопасности (используйте fgets() и не забудьте проанализировать завершающие символы новой строки). И вы никогда не проверяете, не являются ли org и enc не NULL (файлы открыты успешно)

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