相关疑难解决方法(0)

为什么以null结尾的字符串?或者:以空值终止与字符+长度存储

我正在用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结尾的字符串无法做到这一点.

字符串切片(注意:字符串在我的语言中是不可变的).显然,第二较慢(和更容易出错:考虑增加的错误检查beginend对两种功能).

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)

c string algorithm performance null-terminated

29
推荐指数
6
解决办法
1万
查看次数

23
推荐指数
4
解决办法
7万
查看次数

这种情况是什么(s [i] && s [i]!= c)意味着什么?

#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循环内的条件是什么意思?
我以前没见过.谢谢!

c for-loop

2
推荐指数
1
解决办法
72
查看次数

标签 统计

c ×2

null-terminated ×2

algorithm ×1

c++ ×1

for-loop ×1

performance ×1

string ×1