使用char作为C中的数组索引? [英] Using char as array index in C?

查看:180
本文介绍了使用char作为C中的数组索引?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个代码:

  int main(){

char vector [52] ;
char i;

/ *为(i ='a'; i<'z'; i ++){
vector [i] = i-'a初始化向量* /
'+ 1;
}
//向量就像vector ['a'] = 1,vector ['b'] = 2 .. vector ['z'] = 26


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

(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]);
}

返回0;
}

输出:

 字母a:1 
字母b:2
字母c:3
字母d:4
字母e:5
字母f:6
字母g:7
字母h:8
字母i:9
字母j:10
字母k:11
字母l :12
字母m:13
字母n:14
字母o:15
字母p:16
字母q:17
字母r:18
字母s:19
字母t:20
字母u:21
字母v:22
字母w:23
字母x:24
字母y:25
字母z:0
字母A:27
字母B:28
字母C:29
字母D:30
字母E:31
字母F:32
字母G:33
字母H:34
字母I:35
字母J:36
字母K :37
字母L:38
字母M:39
字母N:40
字母O:41
字母P:42
字母Q:43
字母R:44
字母S:45
字母T:46
字母U:47
字母V:48
字母W:49
字母X:50
字母Y:51
字母Z:52
***检测到堆栈粉碎***:./a.out终止
=======回溯:=========
/lib/i386-linux-gnu/libc.so.6 (__fortify_fail + 0x50)[0xc25df0]
/lib/i386-linux-gnu/libc.so.6(+0xe5d9a)[0xc25d9a]
./a.out[0x8048547]
[ 0x343332]
=======内存映射:========
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 0000 0000 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 [堆]
b7772000-b7773000 rw-p 00000000 00:00 0
b7782000- b7785000 rw-p 00000000 00:00 0
bfa50000-bfa71000 rw-p 00000000 00:00 0 [堆栈]
中止了

我不明白为什么会显示此错误消息。
我应该有一个像这样的向量:

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

我知道我有此向量,但错误随之而来。
如何解决此问题?

解决方案

因为'Z'不等于'z'。



'Z'等于90,您的向量只有52个元素。您的最高索引是51,因此您基本上超出了范围!



例如,当您这样做时



<$ (i ='A'; i< ='Z'; i ++)的p $ p>
{
vector [i] = i-'A'+ 27;
}

这是您的第一次迭代:

  vector [65] = 65-65 + 27; //<-错误的索引! 


I have this code:

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;
}

Output :

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

I don't understand why is giving this error message. I should have a vector like this :

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

I understand that I have this vector but the error came with it. How solve this problem ?

解决方案

Because 'Z' is not equal to 'z'.

'Z' is equal to 90 and your vector only has 52 elements. Your highest index is 51 so you are basically going out of bounds!

For example when you are doing this

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

This is what your first iteration looks like:

vector[65] = 65 - 65 + 27; // <-- Wrong index !

这篇关于使用char作为C中的数组索引?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆