У меня возникают проблемы с использованием malloc для выделения памяти с использованием цикла for для домашнего задания. Ниже приведен код моего конструктора, который принимает массив символов и массив указателей символов и возвращает количество токенов в массиве символов.Циклическое распределение динамической памяти C++
Конструктор должен пройти через массив символов, пропустить первый символ, который не пуст (начало первого токена), а затем распечатать индекс этого символа. Затем он должен найти следующий пустой символ в строке (конец токена) и распечатать свой индекс. После этого он вычисляет количество символов в токене и использует 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;
}
При запуске конструктора, он правильно идентифицировать концы лексем, но печатает только первую ячейку памяти, что делает его, кажется, как будто таНос не принимает петлю. Это очень странно, пожалуйста, помогите, если сможете.
Редактировать: Вот простой 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
Я не вижу в вашем коде 'конструктора'. Можете ли вы включить ввод и вывод образцов в свой вопрос? это поможет лучше понять, чего вы пытаетесь достичь. – A4L
Можете ли вы предоставить некоторый пример ввода, с ожидаемым результатом и выходом, который вы действительно получаете. – BoBTFish
Как вы называете этот метод? Какие аргументы вы ему даете? –