Превратить массив в main в глобальный, чтобы потом изменить на main? - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть два массива алфавита в следующем формате:

const char plain[26] = {'a','b',....'y','z'} // this is the the full alphabet
const char crypt[26] = {'i','d',....'m','x'}; // this is the the alphabet scrambled

Порядок алфавита в обоих массивах может меняться в зависимости от ввода.Это изменение происходит в основной функции.

Цель этого состоит в том, чтобы сопоставить буквы строки со второй, как при шифровании.Я сравниваю символы со значениями массива.Так что это выглядело бы так (упрощенно)

text[3] = 'yes';
changed[3];
if(text[0] == plain[25]){    //would be done under a for loop so 25 would be a changing integer value
    changed[0] = [crypt[25];
}

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


Теперь я хочу сделать массивы глобальными.Фактическое шифрование происходит в функции, которая не принимает массивы в качестве переменной.Но я хочу, чтобы функция имела к ним доступ.

Вот как это выглядит сейчас

const char plain[26];
const char crypt[26];
int maint(void){
    const char plain[26] = {'a','b',....'y','z'} \\values get changed here 
    const char crypt[26] = {'i','d',....'m','x'} \\and here

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

Я пробовал разные типы массивов, я считаю, что проблема заключается в инициализации или предоставлении значений массива.

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

b,r
m,o
l,s
...
...
...

В обоих случаях алфавит рандомизирован.Где первый столбец будет соответствовать первому массиву (обычный), второй будет второму массиву (crypt).

Если есть способ прочитать по столбцам и сохранить в формате

plain = 'bml...'; \\whole alphabet randomized
crypt = 'ros...'; \\whole alphabet randomized

Это бы тоже сработало.

Ответы [ 3 ]

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

Удалите «const char» перед массивами plain и crypt в главной функции, чтобы увидеть актуальную проблему.

«Const Char» перед массивами plan и crypt фактически объявляют две новые локальные константы массива char с одинаковыми именами.Поскольку «const» массив char может быть инициализирован только во время объявления, поэтому при инициализации в main не выдается ошибка, поскольку они не являются одинаковыми глобальными массивами conts.

Вместо использования const используйте указатель Const, как предложено в ответ ниже

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

Другой способ взглянуть на это состоит в том, что plain и crypt будут оба распадаться на указатели при доступе (с учетом исключений в) C11 Standard - 6.3.2.1 Другие операнды - L-значения, массивы и функциидесигнаторами (p3) .Так почему бы не использовать для начала глобальные указатели, которые затем могут быть переназначены по мере необходимости в вашем коде?

Это обеспечивает гибкость назначения из (1) строковых литералов ;(2) постоянные массивы;или (3) из составных литералов инициализаторов.Вы можете #define константа для размера (количество символов) plain и crypt указать на.

Например:

#include <stdio.h>

#define NC 3    /* number of chars (26 for you) */

const char *plain, *crypt;  /* global pointers */

void prnchars (const char *arr)
{
    for (int i = 0; i < NC; i++)
        putchar (arr[i]);
    putchar ('\n');
}

int main (void) {

    plain = "abc";              /* assigning literals */
    crypt = "def";

    prnchars (plain);
    prnchars (crypt);

    crypt = "ghi";              /* reassign at will */

    prnchars (crypt);

    const char foo[] = "jkl";   /* constant arrays */
    crypt = foo;

    prnchars (crypt);

    crypt = (const char[]){'m', 'n', 'o'};  /* compound literals */

    prnchars (crypt);

    return 0;
}

Пример Использование / Вывод

$ ./bin/global_ptr
abc
def
ghi
jkl
mno

Это просто еще один способ взглянуть на проблему.

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

plain и crypt, которые есть в main, не совпадают с глобальными.Поскольку вы объявляете их снова, они являются новыми, которые видны только в main.Таким образом, вы не меняете глобальные.

Вместо этого, объявляйте их только один раз глобально и выполняйте присваивание в функции main:

char plain[26];

int main(void) {
    memcpy(plain, "abcdefghijklmnopqrstuvwxyz", 26); //values get changed here
    return 0; // indicate successful program execution
}

Также обратите внимание, что есть некоторые синтаксические ошибкив

const char plain[26] = {'a','b',....'y','z'} \\values get changed here 

Комментарии начинаются с //, а не \\, и вам нужно ; после утверждения.Кроме того, int main должен возвращать int в C.

Конечно, если вам не нужно фактически изменять память и назначать ее только предопределенным наборам символов, вы можете сделать это следующим образомthis:

const char *plain;

int main(void) {
    plain = "abcdefghijklmnopqrstuvwxyz";
    return 0;
}

Таким образом, вы все равно можете читать из него с синтаксисом, подобным plain[5], но вы не можете назначить ему, скажем, plain[5] = 'a';.

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