无法计算 C++ 中的指针!需要有关基本字符串和指针的信息

Posted

技术标签:

【中文标题】无法计算 C++ 中的指针!需要有关基本字符串和指针的信息【英文标题】:Can't figure out pointers in C++! Need info about basic strings and pointers 【发布时间】:2015-11-23 11:40:14 【问题描述】:

各位程序员,你好,我的大学老师给我发了一些用 C++ 解决的问题,我和我的朋友都想不通。看不懂的部分我会写下来。

问题 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;

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

【问题讨论】:

阅读 strchr 的作用。那就看看这两个教程pointers,pointer arithmetic 这主要是 C,而不是 C++。请把你的老师指向这个演讲:Stop Teaching C。好吧,也许你不应该,这取决于她的接受程度...... 他看起来有点固执,我不敢直接面对他(因为我不太了解他)。 我强烈建议阅读Open letter to students with homework problems。这可能会让你理解为什么“愚蠢”的任务有时从长远来看是有意义的。 【参考方案1】:

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

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

所以当你的代码 sn-p 说:

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 风格的字符串也称为“空终止字符串”——它们在末尾自动有一个 \0(空)值条目。 strchr 知道如果碰到这个值,就已经到了字符串的末尾。

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

【讨论】:

【参考方案2】:

在您的示例中,strchr 返回指向字符串中具有值空间的位置的字符指针。如果它是一个有效的while循环指针,则允许它进入循环并增加变量count的值。 add+1 是在字符串中的空格字符之后到达字符串中位置的下一个字符指针的指针算法。

【讨论】:

以上是关于无法计算 C++ 中的指针!需要有关基本字符串和指针的信息的主要内容,如果未能解决你的问题,请参考以下文章

优化动态分配内存的变量

无法分配给 C++ 中的指针数组

在 C++ 中使用指针初始化 char 数组或字符串

指向字符串的指针无法更改字符

如何将对象传递给 C++ 中的函数?

[Js-c++]c++中的指针引用和数组名