我的IDE是Xcode。以下代码无法按预期运行。虽然在较新的C ++标准中推荐使用nullptr。
#include<iostream>
using namespace std;
int count_x(char * p, char x)
{
if(p==nullptr)return 0;
int count = 0;
for (; p!=nullptr; ++p)
if(*p == x)
++count;
return count;
}
int main()
{
char str[] = "I'm a little girl in the little world!";
cout<<"number of t in the string is "<<count_x(str, 't')<<"\n";
}
/*
the expected output is:
number of t in the string is 5
Program ended with exit code: 0
*/
上面的代码可以成功编译,但是当我运行它时,我无法获得预期的输出。在调试模式下,我发现for循环没有停止。所以我将代码更改为以下代码:
#include<iostream>
using namespace std;
int count_x(char * p, char x)
{
if(p==nullptr)return 0;
int count = 0;
for (; *p!='\0'; ++p)
if(*p == x)
++count;
return count;
}
int main()
{
char str[] = "I'm a little girl in the little world!";
cout<<"number of t in the string is "<<count_x(str, 't')<<"\n";
}
/*
the expected output is:
number of t in the string is 5
Program ended with exit code: 0
*/
在我将p!= nullptr更改为* p!=&#39; \ 0&#39;之后,代码工作正常并且获得了预期的输出。虽然代码似乎有效,但我仍然不了解失败或成功的原因。
你能给我一些线索或建议吗?感谢。
答案 0 :(得分:3)
唯一的区别是将nullptr更改为'\ 0'。
还有另一个不同之处:
p!=nullptr
*p!='\0'
^
|
+---- right here, a dereference operation
我仍然不明白失败的原因......
我发现for循环没有停止
当p的值为nullptr(即为零)时,您的条件是停止。但是你只会增加p,那么它怎么能达到零呢?在溢出字符串之前,它不会达到零。
我仍然不明白......成功的原因。
在成功尝试中,结束条件不是比较指针,而是将指向的值与空终止字符进行比较。只要字符串以空值终止,这就可以工作。
附加说明:尽管空指针和空字符都具有相同的名称(null)和相同的值(0),但它们具有不同的类型并且是单独的概念。
答案 1 :(得分:2)
nullptr
的类型为std::nullptr_t
。它是可以转换为任何类型的通用指针文字
'\0'
的类型为char
。它用于 C风格的字符串,用于标记字符串终止
两者在您的平台上可能具有相同的值,但是类型不同。比较例如0公里到0公斤是不好的。
现在代码中的真正问题是p == nullptr
。你只能通过递增来指望指针成为nullptr
(开始指向什么)。
唯一的区别是将
nullptr
更改为'\0'
。
不,您还将p
更改为*p
。
答案 2 :(得分:0)
考虑
int test = NULL;
和
int *test = NULL;
以上代码都可以正常工作。 (虽然上面的第一行会说“关于从NULL转换为非指针类型”的警告
然而,
nullptr实际上是一个“空指针”,总是一个指针。如果您尝试将其指定为整数。它会导致错误
int test = nullptr;
但如果是
,它会奏效int *test = nullptr;