gpt4 book ai didi

c++ - 无法弄清楚 C++ 中的指针!需要有关基本字符串和指针的信息

转载 作者:行者123 更新时间:2023-11-28 05:57:27 27 4
gpt4 key购买 nike

各位程序员大家好,我的大学老师给我发了一些已解决的 C++ 问题,我和我的 friend 都弄不明白。我会写下我们无法理解的部分。

问题 1:您必须输入一个字符串,其中包含空格 ' ',并且代码会计算字符串中的空格。示例:

 asd123       count = 0
a sd123 count = 1
a s d count = 2

解决方法如下:

 typedef char strType[100];
strType str;
cout << "string: ";
cin.getline(str, 100);
cout << "\"" << str << "\"\n";


short count = 0;
char *adr = strchr(str, ' '); //value might be NULL

while (adr)
{
++count;
adr = strchr(adr + 1, ' ');
}




cout << "count: " << count << endl;

短计数 =0 后我们需要解释;我们无法理解 *adr 的值(它是一个确切的数字,还是 true 或 false,或任何类型)。如何将 +1 添加到 adr,while 循环如何结束。因为如果 *adr 是复杂的东西(由许多数据组成),你怎么能将它的值增加一个(它存储出现在 str 中的空格 ' ')并变成停止 while 的东西。

最佳答案

我猜这是您第一次遇到指针。如果您不太了解它们,我强烈建议您去了解它们,因为它们对 C/C++(以及其他语言)非常重要。

不过,为了这个问题的方便,我将给出一个非常粗略的定义。指针“指向”特定的内存位置。它的“类型”用于定义此时它期望使用多少内存。也就是说,一个 char* 指针将只期望处理一个 char 的数据,并且只会保留那么多的内存。 long* 将保留并处理 long 的内存(明显更大,具体多少取决于系统,但这是另一个主题)。

所以当你的代码片段说:

char *adr = strchr(str, ' '); //value might be NULL

意思是:“adr”的值是一个内存位置,它是 char 类型的大小,我们将其设置为等于库函数 strchr 的结果。我们稍后会回到 strchr。

现在,“str”就是所谓的C 风格字符串。这是因为它对字符串使用 C 方法,而不是工作方式略有不同的较新的 C++ 库 string 类型。 C 风格的字符串实际上是一大块连续(无间隙)的内存——在这种情况下,100 个字符在内存中一个接一个地排列。如果我想读取字符串,我所做的就是一个接一个地读取它的每个部分,所以我从头开始,读取一个字符,然后我想向前跳转一个字符的内存,到下一个字符。这就是 adr++ 所做的——它说“让我向前跳一步”,在这种情况下,一步是一个字符,因为那是 adr 的“类型”。这可能有意义也可能没有意义,Mohamad Elghawi 发布了指向指针算法教程的链接,该教程也值得一读。

回到strchr。 strchr 是一个在字符串中搜索特定字符值的函数。在这种情况下,在 str 中找到我 ' '(空格)。所以它转到 str 开头的内存位置,并跳过它直到找到一个空间。如果找不到空格,则返回 NULL - 因此代码中有注释。

如果确实找到了一个空间,它会将那个空间的内存位置分配给 adr。然后我们跳入 while 循环。如果 adr 是 SOMETHING,那么我们至少找到了一个空格,因此重复计数。然后我们说“好的,作为 adr 的空间是第一个空间,所以如果还有更多的空间,它们必须在它之后,所以我们再次从内存位置搜索空间在 adr 的当前值之后, 否则我们会再次拾取相同的空间并且我们的计数将是错误的。继续这样做直到我们得到 NULL 作为答案,每次 adr 不为空时将我们的计数加 1。当 adr 为空时,没有字符串中有更多空格,所以我们的计数结束了。有意义吗?

您可能有的最后一个问题:strchr 如何知道字符串的末尾在哪里?好吧,这是可行的,因为 C 风格字符串也称为“以 Null 结尾的字符串”——它们在末尾自动有一个\0(Null)值条目。 strchr 知道如果它达到这个值,它就到了字符串的末尾。

下次类(class):指针是一个非常基本的概念,将在整个 Internet 的教程和书籍中全面介绍。如果您仔细阅读它们并查看 strchr 的功能,您很可能会在合理的时间内找到答案。然而,我们都曾经是初学者,我意识到这常常有点令人生畏。下次先尝试更努力地找到现有答案:)

关于c++ - 无法弄清楚 C++ 中的指针!需要有关基本字符串和指针的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com