6

这是我所拥有的:

char* input = new char [input_max]
char* inputPtr = iput;

我想使用 inputPtr 来遍历输入数组。但是我不确定什么会正确检查我是否已经到达字符串的末尾:

while (*inputPtr++)
{
    // Some code
}

或者

while (*inputPtr != '\0')
{
    inputPtr++;
    // Some code
}

或更优雅的选择?

4

3 回答 3

9

假设输入字符串以 null 结尾:

for(char *inputPtr = input; *inputPtr; ++inputPtr)
{
  // some code
}

请记住,您发布的示例可能无法提供您想要的结果。在您的 while 循环条件中,您总是在执行后增量。当您在循环中时,您已经通过了第一个字符。举个例子:

#include <iostream>
using namespace std;

int main()
{
  const char *str = "apple\0";
  const char *it = str;
  while(*it++)
  {
    cout << *it << '_';
  }
}

这输出:

p_p_l_e__

注意缺少的第一个字符和_末尾的额外下划线。如果您对预增量和后增量运算符感到困惑,请查看此相关问题。

于 2013-06-14T05:25:51.537 回答
2

假设输入不是空终止的:

char* input = new char [input_max];
for (char* inputPtr = input; inputPtr < input + input_max; 
        inputPtr++) {
  inputPtr[0]++; 
}   

对于空终止的情况:

for (char* inputPtr = input; inputPtr[0]; inputPtr++) {
      inputPtr[0]++; 
}   

但通常这是你能得到的最好的。使用std::vector, orstd::string可能会启用更简洁和更优雅的选项。

于 2013-06-14T05:27:36.947 回答
2

我会做:

inputPtr = input; // init inputPtr always at the last moment.
while (*inputPtr != '\0') {      // Assume the string last with \0
       // some code
       inputPtr++; // After "some code" (instead of what you wrote).
}

这相当于greatwolf建议的for循环。这是个人选择。

请注意,对于您的两个示例,您都在测试当前位置,然后增加。因此,您正在使用下一个字符!

于 2013-06-14T05:31:45.877 回答