在C中使用char作为数组索引
Using char as array index in C?
我有这个代码:
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
我知道我有这个向量,但错误随之而来。如何解决这个问题?
因为'Z'不等于'Z'。
"Z"等于90,而向量只有52个元素。你的最高指数是51,所以你基本上是在越界!
例如,当你进行时
for (i ='A'; i <= 'Z'; i++)
{
vector[i] = i - 'A' + 27;
}
这就是你的第一次迭代:
vector[65] = 65 - 65 + 27; // <-- Wrong index !
for (i ='A'; i <= 'Z'; i++){
vector[i] = i - 'A' + 27;
}
不会做你认为它会做的事。CCD_ 1表示字符CCD_ 2的ASCII值;您的索引立即越界。
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]);
}
向量上没有这样的索引,结果出现越界异常。
char vector[52];
for (i ='a'; i < 'z'; i++){
vector[i] = i - 'a' + 1;
}
a是97。你的数组只有52长。实际上,您已经用第一条可执行语句破坏了数组。
我怀疑你是想说之类的话
vector[i-'a] = something;
(尽管我不太确定"某物"可能是什么。(
首先,附带说明:您的第一个for循环还需要包含"z"。因此:
for (i ='a'; i <= 'z'; i++){
在C中,数组不是从任何值到任何值的映射。它们只是一个数组(或连续列表(,从索引0开始。当你说
char vector[52];
意味着你有一个52号的数组。数组的有效索引为0到51。然而,当您编写像'a'
这样的字符时,它实际上只是一个数字,它是字符a
的ascii码(即0x61,即61十六进制(。您使用的最高索引是'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';
相关文章:
- 数组索引的值没有增加
- 并行用于C++17中数组索引范围内的循环
- 数组索引重载错误
- 通过指针与数组引用扩展数组索引序列
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 缓冲区溢出 - 数组索引越界(严重)
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 查找下一个具有真值C++的数组索引
- 在编译时自动生成用于稀疏数组索引的switch语句
- 在数组索引上引发异常
- C++ 将二维数组索引与条件语句中的函数值进行比较
- 平衡数组索引,同时从左和右对数组求和
- 为什么C ,Devstudio,数组索引工作
- 如何对同一数组索引下的结构成员进行排序?
- 我想返回数组索引,而不是数组值
- C++相当于 Python 的:用于数组索引
- 分段错误:为什么这里的数组索引越界了
- 数组索引在地图上不是整数
- 根据用户输入的每个字母添加到数组索引
- C 数组索引