Как я могу заменить буквы на цифры в C? - PullRequest
0 голосов
/ 27 мая 2018

Итак, я хочу создать своего рода программу шифрования для школьного проекта, например, я хочу заменить букву «а» на: 12345 «b» на 54321 в C, как мне это сделать?не самый лучший, мой код пока:

eFile = fopen("Message.txt", "ab+");
            while(!feof(eFile))
            {
                fscanf(eFile,"%c",&message);
            }

Я хочу, например, если я напишу слово apple в текстовый файл, заставлю программу сканировать его буква за буквой и заменять каждую букву 5-значным числом(У меня они уже предопределены) пример: apple = 12342 69865 69865 31238 43297

Ответы [ 2 ]

0 голосов
/ 27 мая 2018
  • читать символ за символом из ввода
  • использовать простой массив для преобразования между символом в число или в строку или использовать функцию-обработчик для этого
  • напечатать это число
  • заменить не просто, самый простой способ - создать временный файл, записать числа в этот временный файл, чем скопировать временный файл в исходный файл и удалить временный файл.

_

#include <stdio.h>
#include <assert.h>

int cipher_table[255] = {
    ['a'] = 12342,
    ['p'] = 69865,
    ['l'] = 31238,
    ['e'] = 43297,
    // so on...
};

int main()
{
    FILE *fin = stdin; // fopen(..., "r");
    assert(fin != NULL);
    FILE *fout = stdout; // tmpfile();
    assert(fout != NULL);
    for (int c; (c = getc(fin)) != EOF;) {
        if (c == '\n') {
            if (fputc('\n', fout) == EOF) {
                fprintf(stderr, "Error writing to file fout with fputc\n");
                return -1;
            }
            continue;
        }
        if (fprintf(fout, "%5d ", cipher_table[c]) < 0) {
            fprintf(stderr, "Error writing to file fout with fprintf\n");
            return -1;
        }
    }
    close(fin);
    close(fout);
    return 0;
}
0 голосов
/ 27 мая 2018

Я не уверен, можно ли назвать вашу стратегию шифрованием, но это легко сделать с помощью таблицы поиска.

Просто поместите замены в таблицу int следующим образом:

int map[]={ //size will be autoinferred to fit the indices
    ['a']=12342,
    ['p']=69865,
    ['l']=31238,
    ['e']=43297, 
    //you should preferrably have an entry for each value of char
};

И использовать его для печати замен.

int c;
while(EOF!=(c=fgetc(inputFile)))
    if(0>(outPutfile,"%d \n", map[c]))
        return -1;

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

Лучшей идеей может быть просто забыть о перезаписи файла на месте и просто прочитать stdin и записать в stdout - что позволит программе обрабатыватьтакже и потоки, и, возможно, скрипт-обертка может превратить его во встроенный переводчик (через временный файл) после факта, если это необходимо.

...