我正在用C编写语言解释器,我的string类型包含一个length属性,如下所示:
struct String
{
char* characters;
size_t length;
};
Run Code Online (Sandbox Code Playgroud)
因此,我必须花费大量时间在我的解释器中手动处理这种字符串,因为C不包含对它的内置支持.我考虑过切换到简单的以null结尾的字符串只是为了符合底层C,但似乎有很多理由不:
如果使用"length"而不是查找null,则内置边界检查.
您必须遍历整个字符串才能找到它的长度.
你必须做额外的事情来处理以null结尾的字符串中间的空字符.
以空值终止的字符串与Unicode处理不佳.
非空终止字符串可以实习更多,即"Hello,world"和"Hello"的字符可以存储在同一个地方,只是具有不同的长度.使用以null结尾的字符串无法做到这一点.
字符串切片(注意:字符串在我的语言中是不可变的).显然,第二较慢(和更容易出错:考虑增加的错误检查begin和end对两种功能).
struct String slice(struct String in, size_t begin, size_t end)
{
struct String out;
out.characters = in.characters + begin;
out.length = end - begin;
return out;
}
char* slice(char* in, size_t begin, size_t end)
{
char* out = malloc(end - begin + 1);
for(int i = 0; i < end - begin; i++)
out[i] = in[i + …Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
char s[] = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";
int main ()
{
int i, c;
while ((c = getchar()) != EOF) {
for (i = 1; s[i] && s[i] != c; i++);
if (s[i]) putchar(s[i-1]);
else putchar(c);
/* code */
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
什么是s[i] && s[i] != c;for循环内的条件是什么意思?
我以前没见过.谢谢!