我正在自己学习 C++ 并正在解决这个问题:
编写一个名为 trimfrnt() 的函数,从字符串中删除所有前导空格。使用返回类型为 void 的指针编写函数。
我对这个问题的尝试如下,我尝试以两种方式解决这个问题(你可以看到我的两个函数trimfrnt1()
和trimfrnt2()
. trimfrnt1()
工作正常。我有点意外地得到了这个工作。在我编码之后,我不确定它为什么会这样工作。我的困惑在于for
循环。我在下面画了一个 msg 数组的图表:
|<--ptrMsg--------->|
|<------for loop---->|
0 1 2 3 4 5 6 7
+----+----+----+----+----+----+----+----+
| | | G | R | E | A | T | \0 |
+----+----+----+----+----+----+----+----+
| G | R | E | A | T | | | \0 |
+----+----+----+----+----+----+----+----+
问题 1
从上图中,由于重叠,我实际上期待文本:“GREATAT”。因为我只循环了 5 个字母,所以整个字符串如何移动并重新初始化?
问题2
问题说明要使用指针,所以我虽然trimfrnt1
在作弊,因为我正在编制索引,所以我尝试使用另一种trimfrnt2
. 这个函数我被困在while循环中:
// shift characters to beginning of char array
while( *(ptrMsg + count) != '\0' )
{
*ptrMsg = *(ptrMsg + count);
ptrMsg++;
count++;
}
这部分代码对我不起作用。当我打印出来时*(ptrMsg + count)
,我得到了正确的字符,但是当我将它分配给 *ptrMsg 的内容时,我得到了乱码。在这种情况下,我也期待“GREATAT”,因为我没有重新初始化剩余的字符。有没有办法像我试图做的那样使用指针方法来做到这一点?
谢谢!
#include<iostream>
#include<iomanip>
using namespace std;
void trimfrnt1(char msg[], int size)
{
char *ptrMsg = msg;
// Find beginning of text
while(*ptrMsg == ' ')
ptrMsg++;
// Copy text to beginning of array
for(int i=0; i < size; i++)
msg[i] = *ptrMsg++;
// Reset pointer to beginning of array
ptrMsg = msg;
// Print array
cout << "new msg1: ";
cout << "\"" << ptrMsg << "\"" << endl;
cout << endl;
return;
}
void trimfrnt2(char msg[], int size)
{
int count = 0; // used to find leading non-white space
char *ptrMsg = msg; // pointer to character array
// find first place of non white space
while( *(ptrMsg + count) == ' ')
count++;
cout << "count = " << count << endl;
// shift characters to beginning of char array
while( *(ptrMsg + count) != '\0' )
{
*ptrMsg = *(ptrMsg + count);
ptrMsg++;
count++;
}
cout << "count = " << count << endl;
// Reset pointer to beginning of array
ptrMsg = msg;
// Print array
cout << "new msg2: ";
cout << "\"" << ptrMsg << "\"" << endl;
cout << endl;
}
int main()
{
char msg[] = " GREAT";
const int size = sizeof(msg)/sizeof(char);
cout << "Orginal msg:\"" << msg << "\"" << endl;
trimfrnt1(msg, size);
return 0;
}