сравнить два символа в C без ASCII - PullRequest
0 голосов
/ 06 февраля 2019

Так что я хочу сделать шифрование в принципе.То, как я это делаю, - это создание двух массивов и переключение значений.Проблема, с которой я сталкиваюсь, состоит в том, что когда массивы представляют собой массив символов, это не работает.Но когда я преобразовываю в числа ASCII, это делает.Вот пример того, как будут выглядеть эти два массива:

char* plainarray[26] = ["a","b","c"] //this would go on for the entire alphabet
char* cryptarray[26] = ["p","j","n"] //this array is the entire alphabet randomized

Затем я создал значения для открытого текста и зашифрованного текста и значения для цикла for.Например.

char plain[5] = "hello";
char* change[5] = {};
int i;
int j;
length = strlen(text); //length of string for for loop

Затем я использую два цикла for для добавления зашифрованных значений в «crypt»

for(i=0; i<length; i++){
    for (j = 0; j <26; j++){
        if (plain[i] == plainarray1[j]){
            change[i] = cryptarray2[j];
        }
    }
}

Код предупреждения, который я получаю при компиляции:

warning: comparison between pointer and integer

Одним из решений моей проблемы было использование чисел ASCII в массиве простого текста и превращение его в массив int.Это сравнивает два символа, но порядок алфавита будет случайным для этой проблемы, поэтому я не могу этого сделать.Есть лучший способ сделать это?Кроме того, мой массив и назначение для измененного текста («изменить») правильно?Это не дает ему правильного вывода.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Этот тип:

char* plainarray[26] = ...

является массивом указателей на символы, не массивом символов.Измените его следующим образом:

char* plainarray = "abc...";

Затем вы можете получить доступ к массиву следующим образом:

printf("%c", plainarray[0]); // prints 'a'
0 голосов
/ 06 февраля 2019

Вы сравниваете указатели со строками с ==, что неверно, поскольку они, очевидно, все по разным адресам.

Если вы намеревались хранить plainarray и cryptarray как массивы указателейдля строк с нулевым символом в конце, каждая из которых содержит одну букву алфавита, вы можете использовать функцию strcmp для их сравнения (или, поскольку каждая указанная строка имеет длину в один символ плюс терминатор, вы можете сравнить позицию [0]обеих строк).

На мой взгляд, имеет смысл хранить plainarray и cryptarray в виде массивов простого char, однако.

0 голосов
/ 06 февраля 2019

Вы храните массивы указателей на строки.Разыменование ваших массивов указателей дает вам указатель.Чтобы сохранить массив символов, напишите:

const char plainarray[26] = {'a', 'b', 'c', \* ... */ };

или

const char plainarray[] = "abc...";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...