【问题标题】:Why a pointer to a char that is passed by value is not finding the null terminator?为什么指向按值传递的 char 的指针找不到空终止符?
【发布时间】:2012-01-12 01:39:35
【问题描述】:

我已经盯着这个有一段时间了,我对我的 for 循环发生了什么感到困惑。

首先,我让用户输入一个使用 cin.getline() 读取的短语

const int  STRING_MAX  = 1001;
char*      inputString = nullptr;

inputString = new char[STRING_MAX];
cin.getline(inputString, STRING_MAX, '\n');

如果有人想知道.. 我没有填满缓冲区(无论如何这都不重要)。我只输入了大约 25 个字符。

接下来将inputString按值传递给Palindrome class成员函数

word(char* source)

这就是我目前在函数中尝试做的所有事情:

bool Palindrome::word(char* source) {
  for (char* iterator = source; iterator != '\0'; iterator++)
    cout << *iterator << endl;
}

我实际上做得更多,但目前,我将代码简化为您在上面看到的内容,并且出于某种我不明白的原因,循环超出了 char* array 的边界

谁能帮我理解这里发生了什么?

顺便说一句,我很了解 C++ 中的字符串类,但是,对于这个作业(讲师希望我们使用指针以及 new 和 delete 运算符)。

【问题讨论】:

  • 奇怪的代码,但一个措辞出色的问题,+1。
  • for 循环中的测试表达式应该写成!iterator 或者(更完整地)写成iterator != NULL。 ('\0' 是一个 NUL 字节,而不是一个 NULL 指针,尽管“通常的转换”将允许它工作,无论它看起来多么奇怪)

标签: c++ pointers char cstring


【解决方案1】:

iterator != '\0' 测试iterator 是否为空指针。永远不会是这样,这不是您真正想要的。

您的代码不正确,但恰好是有效代码,因为'\0' 是整数值零的词法表示,因此它恰好是一个空指针常量。

要测试iterator 是否指向空终止符,您需要使用*iterator != '\0'(或者只测试*iterator,因为零整数值的计算结果为假)。

【讨论】:

  • 天啊。现在我觉得自己像个智障。我不知道我怎么忽略了这一点。我一定是累了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2016-12-28
  • 2011-08-10
  • 1970-01-01
相关资源
最近更新 更多