私は自分でC++を学んでおり、この問題に取り組んでいました:
文字列からすべての先頭の空白を削除する、trimfrnt() という名前の関数を作成します。戻り値の型が void のポインターを使用して関数を記述します。
問題に対する私の試みは以下のとおりで、この問題を 2 つの方法で解決しようとしました (私の 2 つの関数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;
}