【问题标题】:C++ Finding String Length With Pointer ArithmeticC++ 使用指针算术查找字符串长度
【发布时间】:2015-09-22 14:30:58
【问题描述】:

我现在正在学习Comp Sci 课程,我的老师在黑板上写的一个例子如下 - 这个概念是创建一个string 长度函数,它返回一个带有字符串的size_t长度使用指针算法。我理解这个概念,但每次我尝试这个例子时,我的结果都是0

using namespace std;

size_t strlen(const char* str);

int main(int argc, char** argv) {

    char test[] = {'h','e','l','l','o','\0'};
    cout << strlen(test);

    return 0;
}

size_t strlen(const char* str){
    int idx = 0;
    for( ; *str; str++, idx++){
        return(idx);
    }
}

如果有人能提供有关问题所在的见解,我将不胜感激。

谢谢! :)

【问题讨论】:

  • return 在循环的第一次迭代中。我的猜测是,您错误地从板上复制了代码。很可能是for( ; *str; str++, idx++); return idx;,这根本不是一回事。所有这些都表明,事实上你可能不太了解这个概念。
  • P.S.您实际上并没有在此代码中使用指针 算术
  • 警惕NULL/nullptr输入。
  • 还要小心使用名称strlenstrlen 的一些实现是macros,因此如果包含string.h 标头,则strlen 的所有使用都将替换为strlen 宏。结果真的很奇怪的错误消息。

标签: c++ for-loop strlen


【解决方案1】:
for( ; *str; str++, idx++){
    return(idx);
}

将在第一次迭代时返回idx。您需要做的是让 for 循环运行,然后返回 idx。看起来像:

for( ; *str; str++, idx++){}
return(idx);

你可以用 ; 结束 for 语句,但我觉得很容易错过。通过使用一个空的花括号块,它表明你打算有一个空的循环体

【讨论】:

  • 谢谢!完全有道理,我现在问这个问题我觉得很傻。使用没有主体的循环对我来说是一个新概念。该死的教授需要停止编写代码速记
【解决方案2】:

这个版本实际上使用了指针运算:

size_t strlen(const char* str)
{
    const char * const os = str;
    while ( *str ) ++str;
    return str - os;
}

【讨论】:

    【解决方案3】:

    如@IgorTandetnik 所示,您的循环在 1 次迭代后终止

    size_t strlen(const char* str){
        size_t idx = 0;
        for( ; *str; str++, idx++){
            return(idx); // <------ here
        }
    }
    

    Clang 实际上用 -Weverything 警告级别捕获了这个

    > main.cpp:15:18: warning: loop will run at most once (loop increment
    > never executed) [-Wunreachable-code-loop-increment]
    >     for( ; *str; str++, idx++){
    >                  ^~~~~~~~~~~~
    

    修复很简单:

    size_t strlen(const char* str){
        size_t idx = 0;
        for( ; *str; str++, idx++) {} // here       
        return(idx);    
    }
    

    Live Example

    【讨论】:

      【解决方案4】:
      size_t strlen(const char* str){
          int idx = 0;
      
          while(*str++)
              idx++;
      
          return idx; 
      }
      

      试试上面的方法,看看你是否得到正确的字符串长度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 2019-04-20
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2016-11-02
        相关资源
        最近更新 更多