Я пытаюсь заполнить многомерный массив, который соответствует структуре другого массива.Заполнение многомерного массива на языке C
Я один массив initilized следующим образом:
static char frequencyEn[][7] =
{
['A'] = ".082",
['B'] = ".015",
['C'] = ".028",
['D'] = ".043",
['E'] = ".127",
['F'] = ".022",
['G'] = ".020",
['H'] = ".061",
['I'] = ".070",
['J'] = ".002",
['K'] = ".008",
['L'] = ".040",
['M'] = ".024",
['N'] = ".067",
['O'] = ".075",
['P'] = ".019",
['Q'] = ".001",
['R'] = ".060",
['S'] = ".063",
['T'] = ".091",
['U'] = ".028",
['V'] = ".010",
['W'] = ".024",
['X'] = ".002",
['Y'] = ".020",
['Z'] = ".0O1"
};
Этот массив содержит значения средних частот букв на английском языке. Второй массив, который я пытаюсь инициализировать и заполнять, будет содержать фактические частоты букв предоставленного текста.
Конечная цель - сравнить значения двух разных массивов. Я еще не работаю над кодом, который будет сравнивать два массива - только часть, где я заполняю второй массив с подсчитанными значениями.
Частота слов в строке подсчитывается таким образом. Как я могу инициализировать новый массив и заполнить его этими значениями частоты букв? Я ищу, чтобы создать массив с той же структурой, что и ранее представленным массив:
char *count(char *eText)
{
char * cryptText = "Some encrypted text.";
char string[100];
int c = 0, count[26] = {0};
int accum = 0;
while (cryptText[c] != '\0')
{
if (cryptText[c] >= 'a' && cryptText[c] <= 'z'){
count[cryptText[c]-'a']++;
accum++;
}
else if (cryptText[c] >= 'A' && cryptText[c] <= 'Z'){
count[cryptText[c]-'A']++;
accum++;
}
c++;
}
for (c = 0 ; c < 26 ; c++)
{
if(count[c] != 0)
printf("%c %f\n", c +'a', ((double)count[c])/accum);
}
}
Я пытаюсь понять, как я могу заполнить новый массив с той же структурой, что и первым массивом. В настоящее время код дает мне этот тип печатной продукции:
b 0.103448
c 0.034483
d 0.034483
e 0.034483
g 0.034483
i 0.068966
j 0.068966
k 0.068966
l 0.034483
n 0.034483
p 0.034483
q 0.137931
r 0.103448
s 0.034483
u 0.034483
v 0.034483
x 0.034483
z 0.068966
Как я могу добавить эти значения в массив таким образом:
char frequencyCurrent[][]=
{
['A'] = ".000",
['B'] = ".103"
...
}
В случае полезно видеть вещи в контексте, это больше кода, чтобы показать, как используется инициализированная матрица:
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * cryptText = 0;
static char clef[][7] =
{
['A'] = "X",
['B'] = "Y",
['C'] = "Z",
['D'] = "A",
['E'] = "B",
['F'] = "C",
['G'] = "D",
['H'] = "E",
['I'] = "F",
['J'] = "G",
['K'] = "H",
['L'] = "I",
['M'] = "J",
['N'] = "K",
['O'] = "L",
['P'] = "M",
['Q'] = "N",
['R'] = "O",
['S'] = "P",
['T'] = "Q",
['U'] = "R",
['V'] = "S",
['W'] = "T",
['X'] = "U",
['Y'] = "V",
['Z'] = "W"
};
static char frequencyEn[][7] =
{
['A'] = ".082",
['B'] = ".015",
['C'] = ".028",
['D'] = ".043",
['E'] = ".127",
['F'] = ".022",
['G'] = ".020",
['H'] = ".061",
['I'] = ".070",
['J'] = ".002",
['K'] = ".008",
['L'] = ".040",
['M'] = ".024",
['N'] = ".067",
['O'] = ".075",
['P'] = ".019",
['Q'] = ".001",
['R'] = ".060",
['S'] = ".063",
['T'] = ".091",
['U'] = ".028",
['V'] = ".010",
['W'] = ".024",
['X'] = ".002",
['Y'] = ".020",
['Z'] = ".0O1"
};
enum { MAX_CLEF = sizeof(clef)/sizeof(clef[0]) };
static char *prompt(FILE *fp, const char *prompt, char *buffer, size_t buflen)
{
printf("%s", prompt);
fflush(0);
return fgets(buffer, buflen, fp);
}
static void substitute(FILE *fp, const char *buffer, const char *pad1, const char *pad2)
{
int c;
const char *pad = pad1;
int col = 0;
for (int i = 0; (c = buffer[i]) != '\0'; i++)
{
if (col == 0)
{
fputs(pad, fp);
col += strlen(pad);
pad = pad2;
}
col++;
c = toupper(c);
if (c < MAX_CLEF && clef[c][0] != '\0')
{
fputs(clef[c], fp);
col += strlen(clef[c]);
}
else
{
putc(c, fp);
col++;
}
if (col > 72)
{
putc('\n', fp);
col = 0;
}
}
}
char *count(char *eText)
{
char string[100];
int c = 0, count[26] = {0};
int accum = 0;
char *frequencies[2]
while (cryptText[c] != '\0')
{
if (cryptText[c] >= 'a' && cryptText[c] <= 'z'){
count[cryptText[c]-'a']++;
accum++;
}
else if (cryptText[c] >= 'A' && cryptText[c] <= 'Z'){
count[cryptText[c]-'A']++;
accum++;
}
c++;
}
for (c = 0 ; c < 26 ; c++)
{
if(count[c] != 0)
printf("%c %f\n", c +'a', ((double)count[c])/accum);
}
}
int main(void)
{
char * buffer = 0;
long length;
FILE * plainTextFile = fopen ("plaintext.txt", "rb");
FILE * cipherTextFile = fopen("ciphertext.txt", "w+");
if (plainTextFile)
{
fseek (plainTextFile, 0, SEEK_END);
length = ftell (plainTextFile);
fseek (plainTextFile, 0, SEEK_SET);
buffer = malloc (length);
if (buffer)
{
fread (buffer, 1, length, plainTextFile);
}
fclose (plainTextFile);
}
if (buffer)
{
printf("%s", buffer);
}
else {
printf("failure");
}
substitute(cipherTextFile, buffer, "", " ");
if (cipherTextFile)
{
fseek (cipherTextFile, 0, SEEK_END);
length = ftell (cipherTextFile);
fseek (cipherTextFile, 0, SEEK_SET);
cryptText = malloc (length);
if (cryptText)
{
fread (cryptText, 1, length, cipherTextFile);
}
fclose (cipherTextFile);
}
if (cryptText)
{
printf("%s", cryptText);
}
else {
printf("failure");
}
}
Укажите, какой массив? Этот вопрос непонятен. Что ты хочешь делать? –
Массив 'frequencyEn' выглядит очень странно. Какую проблему вы пытаетесь решить? Он также никогда не используется в следующем коде, который вы показали. – 5gon12eder
@ 5gon12eder Мне интересно узнать, как это странно и что я могу сделать, чтобы улучшить его. Я новичок в C. См. Правки – user25976