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;
}
我认为t[p[j]]=m-1-j;
部分是使用字符编制索引的。
有人可以解释一下它实际上是如何工作的吗?
答案 0 :(得分:1)
数组索引运算符被视为*(arr + index)
。
当二进制+
运算符的一个操作数是指针时,另一个操作数必须是整数类型。
char
是一个完整的类型。
因此,
t[p[j]] = m-1-j;
是一份法律声明。
答案 1 :(得分:0)
p[j]
返回j
中的p[]
的ascii代码 - t
中的字符,稍后将用作<context:property-placeholder location="app.properties"/>
中的索引(ascii代码扩展为int编译器,请参阅整数促销)。
答案 2 :(得分:0)
该字符将转换为等效的ascii值,并充当数组的索引。下面的代码为您提供了一个示例,
void main()
{
int a[10];
a['\t'] = 10;
printf("%d\n",a[9]);
}
输出:10
此处ascii值为9,因此[9]为10.请参阅https://www.asciitable.com/表示十进制和十六进制等效字符。
希望它对你有所帮助。
答案 3 :(得分:0)
char
是一个完整的类型。它可以用作[]
运算符的索引值。但请注意,t['0']
与t[0]
不是同一个元素。 '0'
的值取决于平台上使用的编码。大多数环境使用ASCII作为源和执行字符集,其中'0'
的值为48。
通过字符值索引对许多算法都很有用,尤其是搜索和单词匹配。 <ctype.h>
中函数的典型实现使用257个条目的数组(有时候安全性为384个条目),其中函数参数用作索引。
然而,使用
char
值的索引变量存在一个主要问题:char
类型默认情况下可以签名或无符号,所以它的值范围可以包含负值。在代码片段中,如果t
是一个数组或指向数组开头的指针,p
中任何带负值的字符都会导致访问数组边界外的字符,该字符具有<强>未定义的行为。建议提高警告级别,以便编译器诊断出隐藏的潜在错误。使用
gcc -Wall
或clang -Weverything
。
为避免此潜在问题,应以这种方式修改代码:
#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;
}
另请注意,i
,j
,m
和t
数组应具有size_t
类型,以处理超过INT_MAX
的字符串。