Используя char как индекс массива в C? - PullRequest
0 голосов
/ 11 октября 2011

У меня есть этот код:

int main(){

  char vector[52];
  char i;

  /* initialize the vector */
  for (i ='a'; i < 'z'; i++){
    vector[i] = i - 'a' + 1;
  } 
  // vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26


  for (i ='A'; i <= 'Z'; i++){
    vector[i] = i - 'A' + 27;
  }
  // vector is like vector['A'] = 27, vector['B'] = 28 .. vector['z'] = 52

  for (i ='a'; i <= 'z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  } 

  for (i ='A'; i <= 'Z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  }

  return 0;
}

Вывод:

letter a : 1 
letter b : 2 
letter c : 3 
letter d : 4 
letter e : 5 
letter f : 6 
letter g : 7 
letter h : 8 
letter i : 9 
letter j : 10 
letter k : 11 
letter l : 12 
letter m : 13 
letter n : 14 
letter o : 15 
letter p : 16 
letter q : 17 
letter r : 18 
letter s : 19 
letter t : 20 
letter u : 21 
letter v : 22 
letter w : 23 
letter x : 24 
letter y : 25 
letter z : 0 
letter A : 27 
letter B : 28 
letter C : 29 
letter D : 30 
letter E : 31 
letter F : 32 
letter G : 33 
letter H : 34 
letter I : 35 
letter J : 36 
letter K : 37 
letter L : 38 
letter M : 39 
letter N : 40 
letter O : 41 
letter P : 42 
letter Q : 43 
letter R : 44 
letter S : 45 
letter T : 46 
letter U : 47 
letter V : 48 
letter W : 49 
letter X : 50 
letter Y : 51 
letter Z : 52 
*** stack smashing detected ***: ./a.out terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0xc25df0]
/lib/i386-linux-gnu/libc.so.6(+0xe5d9a)[0xc25d9a]
./a.out[0x8048547]
[0x343332]
======= Memory map: ========
00110000-0012a000 r-xp 00000000 08:01 131939     /lib/i386-linux-gnu/libgcc_s.so.1
0012a000-0012b000 r--p 00019000 08:01 131939     /lib/i386-linux-gnu/libgcc_s.so.1
0012b000-0012c000 rw-p 0001a000 08:01 131939     /lib/i386-linux-gnu/libgcc_s.so.1
00a19000-00a1a000 r-xp 00000000 00:00 0          [vdso]
00aa4000-00ac0000 r-xp 00000000 08:01 131898     /lib/i386-linux-gnu/ld-2.13.so
00ac0000-00ac1000 r--p 0001b000 08:01 131898     /lib/i386-linux-gnu/ld-2.13.so
00ac1000-00ac2000 rw-p 0001c000 08:01 131898     /lib/i386-linux-gnu/ld-2.13.so
00b40000-00c9a000 r-xp 00000000 08:01 131911     /lib/i386-linux-gnu/libc-2.13.so
00c9a000-00c9b000 ---p 0015a000 08:01 131911     /lib/i386-linux-gnu/libc-2.13.so
00c9b000-00c9d000 r--p 0015a000 08:01 131911     /lib/i386-linux-gnu/libc-2.13.so
00c9d000-00c9e000 rw-p 0015c000 08:01 131911     /lib/i386-linux-gnu/libc-2.13.so
00c9e000-00ca1000 rw-p 00000000 00:00 0 
08048000-08049000 r-xp 00000000 08:01 40062      /home/valter/Documents/Complexidade/recursivo/a.out
08049000-0804a000 r--p 00000000 08:01 40062      /home/valter/Documents/Complexidade/recursivo/a.out
0804a000-0804b000 rw-p 00001000 08:01 40062      /home/valter/Documents/Complexidade/recursivo/a.out
0846f000-08490000 rw-p 00000000 00:00 0          [heap]
b7772000-b7773000 rw-p 00000000 00:00 0 
b7782000-b7785000 rw-p 00000000 00:00 0 
bfa50000-bfa71000 rw-p 00000000 00:00 0          [stack]
Aborted

Я не понимаю, почему выдает это сообщение об ошибке.У меня должен быть такой вектор:

vector['a'] = 0, vector['b'] = 1,  .., vector['z'] = 26, vector['A'] = 27, vector['B'] = 28, .., vector['Z'] = 52

Я понимаю, что у меня есть этот вектор, но ошибка пришла с ним.Как решить эту проблему?

Ответы [ 5 ]

6 голосов
/ 11 октября 2011

Поскольку 'Z' не равно 'z'.

'Z' равно 90, и ваш вектор содержит только 52 элемента.Ваш самый высокий индекс 51, поэтому вы в основном выходите за пределы!

Например, когда вы делаете это

  for (i ='A'; i <= 'Z'; i++)
  {
    vector[i] = i - 'A' + 27;
  }

Вот как выглядит ваша первая итерация:

vector[65] = 65 - 65 + 27; // <-- Wrong index !
2 голосов
/ 11 октября 2011
for (i ='A'; i <= 'Z'; i++){
    vector[i] = i - 'A' + 27;
}

Не делает то, что вы думаете, что делает.'A' означает значение ASCII для символа A, равное 65;ваш индекс выходит за пределы сразу.

1 голос
/ 11 октября 2011
  char vector[52];
  for (i ='a'; i < 'z'; i++){
    vector[i] = i - 'a' + 1;
  } 

'a' равно 97. Длина вашего массива всего 52.Вы взорвали массив практически вашим первым исполняемым оператором.

Я подозреваю, что вы хотели сказать что-то вроде

    vector[i-'a] = something;

(хотя я не совсем уверен, что может быть "что-то".)

1 голос
/ 11 октября 2011
char vector[52];

Итак, доступные индексы vector - от 0 до 51. Но -

for (i ='A'; i <= 'Z'; i++) // 'A' = 65 and 'Z' = 90
{
    printf("letter %c : %d \n", i, vector[i]);
}

Нет таких индексов на векторе и исключение из границ.

0 голосов
/ 11 октября 2011

Во-первых, примечание: ваш первый цикл for должен также включать 'z'.Следовательно:

for (i ='a'; i <= 'z'; i++){

В C массивы не являются отображениями любого значения на любое значение.Они являются просто массивом (или непрерывным списком), начиная с индекса 0. Когда вы говорите,

char vector[52];

означает, что у вас есть массив размером 52. Допустимые индексы для массива - от 0 до 51. Однакокогда вы пишете символ, такой как 'a', на самом деле это просто число, которое является кодом ascii символа a (0x61, то есть 61 hex).Наибольший индекс, который вы используете, равен 'z', то есть 122. Следовательно, ваш массив должен иметь допустимый индекс 122, поэтому он должен иметь размер не менее 123.

Таким образом, ваш код становитсявот так:

int main(){

  char vector[123];
  char i;

  /* initialize the vector */
  for (i ='a'; i <= 'z'; i++){
    vector[i] = i - 'a' + 1;
  } 
  // vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26


  for (i ='A'; i <= 'Z'; i++){
    vector[i] = i - 'A' + 27;
  }
  // vector is like vector['A'] = 27, vector['B'] = 28 .. vector['z'] = 52

  for (i ='a'; i <= 'z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  } 

  for (i ='A'; i <= 'Z'; i++){
    printf("letter %c : %d \n", i, vector[i]);
  }

  return 0;
}

Также в вашем вопросе есть противоречие.Сначала вы говорите, что имеете:

// vector is like vector['a'] = 1, vector['b'] = 2 .. vector['z'] = 26

, затем говорите:

У меня должен быть такой вектор:

vector['a'] = 0, vector['b'] = 1,  .., vector['z'] = 26, vector['A'] = 27, vector['B'] = 28, .., vector['Z'] = 52

, есливы хотите, чтобы vector['a'] начинался с 0, а не с 1, вам нужно изменить формулу с vector[i] = i - 'a' + 1; на vector[i] = i - 'a';

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