2013-06-13 6 views
0

У меня возникают проблемы с использованием 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 
+0

Я не вижу в вашем коде 'конструктора'. Можете ли вы включить ввод и вывод образцов в свой вопрос? это поможет лучше понять, чего вы пытаетесь достичь. – A4L

+0

Можете ли вы предоставить некоторый пример ввода, с ожидаемым результатом и выходом, который вы действительно получаете. – BoBTFish

+1

Как вы называете этот метод? Какие аргументы вы ему даете? –

ответ

0

tklist представляет собой массив указателей. На линии

tklist[tknIndex] = (char *) malloc(tknLength +1); 

вы присваиваете указатель на элемент массива tklist[]. Сам tklist не изменился! только его элементам присваивается значение. Поэтому, когда вы делаете cout<<tklist<<endl;, tklist всегда печатает адрес, указывающий.

Другое дело, что ваша основная программа *tokenList не инициализирована, поэтому она указывает произвольный адрес (0x7fffd3762c70).

Я предлагаю вам следует выделить память для *tokenList раз в вашем главном() перед вызовом parseCommandLine(line, tokenList); и печатать только cout<<tklist+tknIndex<<endl;parseCommandLine() в.

Смежные вопросы