我的函数如何计算字符串的长度返回负值?

时间:2019-07-07 03:49:45

标签: c

我已经使用指针算术编写了一个函数来计算字符串的长度,但是它似乎只能通过使用hackish方法来正常工作。

我尝试使用对内存寻址的理解来使该功能按预期工作。

0

第一个函数返回正确的长度,但是第二个函数返回0,这为什么?

3 个答案:

答案 0 :(得分:3)

这两个函数都不正确,因为:

  • 您没有初始化select t1.* from table_name t1 where exists( select 1 from table_name t2 where t1.post_user_id=t2.post_user_id and post_shared<>0) ,因此行为是不确定的。
  • 获取绝对值是解决问题的la脚尝试……纠正症状,但未解决问题。不要这样做,请调查问题。
  • length具有未定义的行为,因为对length += str - (++str);的副作用可能发生在获取左操作数str的值之前或之后。
  • str是违反约束的:在C中不允许添加2个指针。

您应该写:

length += str + (++str);

根据目标体系结构,仅递增size_t getLength(const char *str) { size_t length = 0; while (*str != '\0') { length++; str++; } return length; } 并最后计算差值可能会更有效:

str

答案 1 :(得分:-1)

您应该在两个示例中初始化length变量。

您实质上是在尝试这样做:

 int getLength(const char* str) {
     int length = 0;
     while(*str != '\0') {
         length ++; // str - (++str) is always -1;
         str++;
     }
     return length;
 }

答案 2 :(得分:-3)

您的功能有很多问题:

  1. 您不初始化自动变量。
  2. 您的指针算术没有太大意义(至少,我无法理解其背后的逻辑是什么)
  3. 结果pf操作,在一种尺寸上,您具有左值,并且post(pre)递增或递减是未定义的(它表示未定义的行为更快)

下面有strlen函数的两个几乎相同的版本。有时,根据目标硬件的不同,小的更改可能会对功能性能产生重大影响。

此版本对于ARM目标而言更为理想

size_t getlen(const char *s)
{
    const char *p = s;

    while(*p++);

    return p - s - 1;
}

这对于x86目标来说更好

size_t getlen(const char *s)
{
    const char *p = s;

    while(*p)
    {
        p++;
    }

    return p - s;
}