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

Can't figure out pointers in C++! Need info about basic strings and pointers

本文关键字:指针 字符串 信息 C++      更新时间:2023-10-16

各位程序员好,我的大学老师给我发了一些用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;

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

我猜这是您第一次遇到指针。如果你不太理解它们,我强烈建议你去学习它们,因为它们对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++的作用-它说"让我前进一步",在这种情况下,一步是char,因为这是adr的"类型"。这可能有意义,也可能没有意义,Mohamad Elghawi发布了一个指针算术教程的链接,也值得一读。

返回strchr。strchr是一个在字符串中搜索特定字符值的函数。在这种情况下,在str中查找me"(空格)。因此,它会转到str开头的内存位置,并跳过它,直到if找到空格为止。如果它找不到空格,就会返回NULL——因此代码中会有注释。

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

最后一个问题是:strchr如何知道字符串的末尾在哪里?好吧,这是因为C样式字符串也被称为"以Null结尾的字符串"——它们的末尾自动有一个\0(Null)值条目。strchr知道,如果它达到这个值,那么它已经到达字符串的末尾。

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

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