C中的数组可以由字符索引吗? void shifttable(字符p[]{ int i,j,m; m=strlen(p); 对于(i=0;i
我想,C中的数组可以由字符索引吗? void shifttable(字符p[]{ int i,j,m; m=strlen(p); 对于(i=0;i,c,arrays,C,Arrays,我想,t[p[j]]=m-1-j零件,使用字符索引。 有人能解释一下它是如何工作的吗?数组索引操作符被视为*(arr+index) 当二进制+运算符的一个操作数是指针时,另一个操作数必须是整数类型 char是一种整数类型 因此, void shifttable(char p[]) { int i, j, m; m = strlen(p); for (i = 0; i < MAX; i++) t[i] = m; for (j = 0; j &l
t[p[j]]=m-1-j代码>零件,使用字符索引。
有人能解释一下它是如何工作的吗?数组索引操作符被视为*(arr+index)
当二进制+
运算符的一个操作数是指针时,另一个操作数必须是整数类型
char
是一种整数类型
因此,
void shifttable(char p[]) {
int i, j, m;
m = strlen(p);
for (i = 0; i < MAX; i++)
t[i] = m;
for (j = 0; j < m - 1; j++)
t[p[j]] = m - 1 - j;
}
是一种法律声明。p[j]
返回p[]
中j
-第个字符的ascii码,该字符稍后用作t
中的索引(ascii码由编译器扩展为int,请参见整数升级) 字符将转换为等效的ascii值,并充当数组的索引。下面的代码给出了一个示例
t[p[j]] = m-1-j;
产出:10
这里tab的ascii值是9,所以[9]将是10。请参阅十进制和十六进制字符的等效值
希望对您有所帮助。char
是一种积分类型。它可以用作[]
运算符的索引值。但是请注意,t['0']
与t[0]
不是同一个元素。'0'
的值取决于平台上使用的编码。大多数环境对源字符集和执行字符集使用ASCII,其中'0'
的值为48
通过字符值建立索引对于许多算法都很有用,尤其是搜索和单词匹配。
中函数的典型实现使用257个条目的数组(有时为了安全起见使用384个条目),其中函数参数用作索引
然而,在使用char
值作为索引变量时存在一个主要问题:char
类型在默认情况下可以是有符号的或无符号的,因此其值的范围可以包含负值。在代码片段中,如果t
是一个数组或指向数组开头的指针,则p
中任何具有负值的字符都将导致访问超出数组边界,这具有未定义的行为
建议提高警告级别,以便编译器诊断隐藏得很好的潜在bug。使用gcc-Wall
或clang-Weverything
为避免此潜在问题,应按以下方式修改代码:
void main()
{
int a[10];
a['\t'] = 10;
printf("%d\n",a[9]);
}
#定义最大值256
int t[MAX];
void可移位(字符p[]{
int i,j,m;
m=strlen(p);
对于(i=0;i
还请注意,i
、j
、m
和t
数组应具有类型size\u t
,以处理长度超过INT\u MAX的字符串,并添加一个(INT)
,并且在不更改代码功能的情况下,这段代码是如何命名的@user202729:不太可能。最简单的方法是理解char
是整数类型,因此是有效的数组索引。
#define MAX 256
int t[MAX];
void shifttable(char p[]) {
int i, j, m;
m = strlen(p);
for (i = 0; i < MAX; i++)
t[i] = m;
for (j = 0; j < m - 1; j++)
t[(unsigned char)p[j]] = m - 1 - j;
}