无法在C++中找出指针!需要有关基本字符串和指针的信息
Can't figure out pointers in C++! Need info about basic strings and pointers
各位程序员好,我的大学老师给我发了一些用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是指针算术,用于到达字符串中空格字符之后的下一个字符指针。
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 使用指针初始化 char 数组或字符串 C++
- 指针保留字符串
- Visual c ++,使用字符串引用/指针调用 dll 函数
- strcpy 在类中无法使用字符串指针
- C++为 void 指针分配一个字符串
- OpenGL 统一名称指针作为字符串
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 转换指针引用的字符串
- 未分配释放C++(C 字符串)指针
- 为什么 C 样式字符串的工作空指针检查不?
- 为什么多维数组中的空字符串文本衰减为空指针?
- 使用终止程序的指针在数组中输入字符串
- 将指针作为缓冲区传递到第一个字符串元素
- 指针 - 字符串C
- C++:更改指针字符串的值
- 使用带字符指针字符串的基于范围的For循环
- 转换/解析指针字符串和双精度
- 有问题分配字符串指针字符串值