宿題の for ループを使用して malloc を使用してメモリを割り当てる際に問題が発生しています。以下は、char 配列と char ポインター配列を受け取り、char 配列内のトークンの数を返すコンストラクターのコードです。
コンストラクターは char 配列を調べ、空でない最初の文字 (最初のトークンの先頭) までスキップしてから、その文字のインデックスを出力する必要があります。次に、文字列内の次の空の文字 (トークンの末尾) を見つけ、そのインデックスを出力する必要があります。その後、トークン内の文字数を計算し、malloc を使用してポインタ配列にメモリを割り当てます。教授から memcpy を使用してトークンをポインター配列にコピーするように言われました。次に、プログラムはポインター配列を出力します。ここにコードがあります
#include <iostream>
using namespace std;
int parseCommandLine(char cline[], char *tklist[])
{
int lineLength = strlen(cline);
int tknCount = 0;
int tknStart;
int tknEnd;
int tknLength;
int tknIndex;
bool check;
cout<<cline<<":"<<lineLength<<endl;
if(cline[0]==0)
{
check = false;
}
else
{
check = true;
}
for(int j=0; j<=lineLength; j++)
{
if (isspace(cline[j]) == false && check==false)
{
cout<<j<<endl;
check = true;
tknStart = j;
}
else if(j==0 && check==true)
{
cout<<j<<endl;
tknStart = j;
}
else if (check==true && (isspace(cline[j]) || j==lineLength))
{
cout<<--j<<endl;
check = false;
tknCount++;
tknIndex = tknCount - 1;
tknEnd = j;
tknLength = tknEnd-tknStart;
tklist[tknIndex] = (char *) malloc(tknLength +1);
memcpy(tklist + tknIndex,cline + tknStart, tknLength);
cout<<tklist<<endl;
}
}
cout<<"There are "<<tknCount<<"tokens in this line.\n"<<endl;
tknCount = 0;
return tknCount;
}
コンストラクターを実行すると、トークンのエンドポイントが正しく識別されますが、最初のメモリ位置のみが出力されるため、malloc がループを受け入れていないように見えます。とても奇妙です、できれば助けてください。
編集main()
:これはコメントに基づく簡単なものです:
int main ()
{
char * out[6] = {0};
char cline[] = "new_sensor_node SN42 42 3.57 5.0 7";
parseCommandLine(cline, out);
return 0;
}
これを実行した結果は次のとおりです。
$ ./a.out
new_sensor_node SN42 42 3.57 5.0 7:34
0
14
0x7fffd3762c70
16
19
0x7fffd3762c70
21
22
0x7fffd3762c70
24
27
0x7fffd3762c70
29
31
0x7fffd3762c70
33
33
0x7fffd3762c70
34
There are 6tokens in this line.
反復ごとに同じアドレスが出力されることに注意してください。
リクエストに応じて、ここに入力コードがあります
ifstream infile;
char line[MAX_CMD_LINE_LENGTH] = {0};
char *tokenList[MAX_TOKENS_ON_A_LINE];
int main()
{
infile.open("p4input.txt", ios::in);
if(infile.fail())
{
cout<<"The input file has failed to open. Program will now terminate."<<endl;
return 0;
}
else
{
infile.getline(line,MAX_CMD_LINE_LENGTH);
parseCommandLine(line, tokenList);
system("pause");
return 0;
}
}
ヘッダー内
#define MAX_CMD_LINE_LENGTH 256
#define MAX_TOKENS_ON_A_LINE 30