【发布时间】:2017-01-19 05:21:02
【问题描述】:
我创建了我的strlen() 函数版本。
unsigned int my_strlen(char *p)
{
unsigned int i = 0;
while(*p!='\0')
{
i++;
p++;
}
return i;
}
每次运行时它都会给我正确的输出。但是我的同事说这段代码可能会在字符长度大于1 byte 的系统上导致问题。是这样吗??
于是他们修改了代码如下:
unsigned int my_strlen(char *p)
{
unsigned int i = 0;
char *start = p;
while(*p!='\0')
{
i++;
p++;
}
return p - start;
}
我一直认为 C 中的字符是 1 个字节长。
是前者的sn-p优于后者还是相反??
【问题讨论】:
-
您的同事可能正在考虑使用 UTF 字符集(例如),您的字符超过 8 位(例如,大于八位字节)。您的第二个实现有一个未使用的变量,因此更糟。
-
@markw 由于 UTF 字符占用 2 个字节,所以在这种情况下 char 是 2 个字节长?
-
指针算法的工作方式与数组索引相同。在这两种情况下,编译器都知道数据大小。所以
p++被调整为指向下一个数据项,不管它的大小。您的朋友保留函数参数的副本并递增p也是错误的,应该反过来 - 修改参数的副本。 -
@Cody 根据我的经验,UTF 通常需要使用所谓的“宽字符”,它包含多个字符。根据您的平台,宽字符可能与字符大小相同。
-
i乘以sizeof(char)(始终为 1)是不必要但无害的。对于任何其他类型,您都希望这样做。
标签: c types char sizeof strlen