2015-07-16 2 views
0

Дополнительный Q в конце ротора [0] [0] .order от ротора [0] [0] .notch. В чем причина этого и что нужно сделать, чтобы избежать этой конкатенации?Правильный способ инициализации массива 2D-структуры char

#include <stdio.h> 

struct rotor_wirings 
{ 
    char order[26]; 
    char notch[2]; 
}; 
/* rotor[MODEL][ROTORNAME] */ 
struct rotor_wirings rotor[10][10] = 
{ 
    /* Commercial Enigma A, B */ 
    { 
     { "DMTWSILRUYQNKFEJCAZBPGXOHV", "Q" }, 
     { "HQZGPJTMOBLNCIFDYAWVEUSRKX", "E" } 
    } 
}; 

int main() 
{ 
    printf("First rotor is: %s\n", rotor[0][0].order); 
    return 0; 
} 

Выход:

First rotor is: DMTWSILRUYQNKFEJCAZBPGXOHVQ 
+0

Вы переходите границу. Это UB (https://en.wikipedia.org/wiki/Undefined_behavior) – Abhineet

+0

Обратите внимание, что неопределенное поведение находится в строке 'printf()', а не в инициализации. Вы зарезервировали 26 байтов для хранения 26 символов; данные не заканчиваются на нуль. Это верно, но это не строка. Это означает, что вы не должны использовать простой '% s' для его печати. Правильно использовать 'printf (« Первый ротор:% .26s \ n », rotor [0] [0] .order);' который ограничивает печать 26 символами, выделенными члену 'order' структуры , Кроме того, вы должны выделить 27 символов для 'order' члена' struct rotor_wirings', что позволяет перестановке нумерации в нуль. –

ответ

3

Вы не оставляли места для завершающего нуля в конце order строки. Он должен быть

char order[27]; 
-1

Одним из способов может быть, как это:

struct rotor_wirings rotor[10][10] = 
{ 
    /* Commercial Enigma A, B */ 
    { 
     { "DMTWSILRUYQNKFEJCAZBPGXOHVQ"}, 
     { "HQZGPJTMOBLNCIFDYAWVEUSRKXE" } 
    } 
}; 
+1

Добро пожаловать в переполнение стека. Пожалуйста, объясните, есть ли какое-либо значение для разности интервалов. Более серьезно, вы пытаетесь сжать 28 символов в массив 'char [26]', который не будет работать, и вы не объяснили, почему вы игнорируете поле данных надреза. –

+0

Проверьте это: https://en.wikipedia.org/wiki/Undefined_behavior – Abhineet

0

Вы написали на всех 26 байт, не оставляя места для прекращения '\0' полукокса, следовательно, вызывая Undefined Behavior. С 27 массив символов, вы получите желаемый результат. Live Example

struct rotor_wirings 
{ 
    char order[27]; // Extra byte for terminating '\0' 
    char notch[2]; 
}; 
0

Ее выпуск выравнивание памяти, и вы не объявляли достаточно места для вашего массива для того, чтобы быть нулем, чтобы исправить этот конкретный код:

char order[27]; 

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

ref: https://en.wikipedia.org/wiki/Data_structure_alignment

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