【问题标题】:Incrementing pointers for *char in a while loop在while循环中增加*char的指针
【发布时间】:2013-06-14 05:22:20
【问题描述】:

这是我所拥有的:

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

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

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

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

或者更优雅的选择?

【问题讨论】:

  • 它们是等价的。当然,您必须确保数组中确实存在\0
  • 这是一个关于你在数组中放入什么的问题。你确定你的数组中有一个'\0' 元素吗?如果有,你确定'\0' 元素在数组的范围内吗?
  • 我是编程新手,如果我要问的内容是多余的,请原谅我是 '\0' == 0?
  • "is '\0' == 0" - 是的。 Look here.
  • @juanchopanza 那么是不是意味着while语句在解引用后首先检查inputPtr的值,然后再递增inputPtr中存储的内存地址??? (我对指针还是新手,所以当涉及到这些东西时我会感到困惑)

标签: c++ string loops pointers traversal


【解决方案1】:

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

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__

请注意缺少的第一个字符和末尾的额外_ 下划线。如果您对前自增和后自增运算符感到困惑,请查看this related question

【讨论】:

    【解决方案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循环。这是个人选择。

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

    【讨论】:

    • 那么,如果我坚持我的例子,做一段时间会更合适吗?
    • do-while 意味着:在执行一些代码后进行测试,因此,总是至少执行一次循环。例如,如果您想考虑 \0 字符,这可能会很有用。但这不等同于您的示例。
    【解决方案3】:

    假设输入不是空终止的:

    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::vectorstd::string 可能会启用更简洁、更优雅的选项。

    【讨论】:

    • 输入何时不能为空终止?
    • 并非所有内容都是字符串。这可以是一个数字向量,也可以是某种表格,在这些情况下 null 只是另一个值
    • 我还没有学过向量,但请记住,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多