Вывод неправильный. Возможная проблема strncpy?

Итак, я пытаюсь получить этот код для анализа каждой строки, введенной из файла, в отдельные токены, а затем добавить каждую по очереди в массив tklist. Тогда основной просто распечатывает каждый токен. Тем не менее, он печатает пробелы, и когда я вхожу в код, похоже, что strncpy не работает. Есть идеи, в чем проблема? Я не получаю ошибок.

Вот основная функция:

#include <iostream>
#include <fstream>
using namespace std;

#include "definitions.h"#include "system_utilities.h"

int main()
{
ifstream inFile;

char line[MAX_CMD_LINE_LENGTH];
char* token[MAX_TOKENS_ON_A_LINE];
int numtokens;

system("pwd");
inFile.open("p4input.txt", ios::in);
if(inFile.fail()) {
cout << "Could not open input file.  Program terminating.\n\n";
return 0;
}
while (!inFile.eof())
{
inFile.getline(line, 255);
line[strlen(line)+1] = '\0';
numtokens = parseCommandLine(line, token);
int t;
for (t=1; t <= numtokens; t++) {
cout << "Token "<< t << ": " << token[t-1] << "\n";
}

}
return 0;
}

А вот функция parseCommandLine:

int parseCommandLine(char cline[], char *tklist[]){
int i;
int length; //length of line
int count = 0; //counts number of tokens
int toklength = 0; //counts the length of each token
length = strlen(cline);
for (i=0; i < length; i++) {   //go to first character of each token

if (((cline[i] != ' ' && cline[i-1]==' ') || i == 0)&& cline[i]!= '"') {

while ((cline[i]!=' ')&& (cline[i] != '\0') && (cline[i] != '\r')){
toklength++;
i++;
}
//---------------
tklist[count] = (char *) malloc( toklength +1);
strncpy(tklist[count], &cline[i-toklength], toklength);
//--------------
count ++;
toklength = 0;
}

if (cline[i] == '"') {
do {
toklength++;
i++;
if (cline[i] == ' ') {
toklength--;
}
} while (cline[i]!='"');

//--------------
tklist[count] = (char *) malloc( toklength +1);
strncpy(tklist[count], &cline[i-toklength], toklength);
//--------------
count ++;
toklength = 0;
}

}
int j;
for (j = 0; j < count; j++) {
free( (void *)tklist[j] );
}
return count;

}

Как я уже сказал, когда я отлаживаю, это похоже на проблему с копированием, но я новичок, поэтому я подозреваю, что я делаю что-то не так.

Спасибо за любую помощь, вы можете дать!

0

Решение

Попробуйте что-то вроде

tklist[count][toklength]='\0';

после

strncpy(tklist[count], &cline[i-toklength], toklength);

strncpy () не обязательно добавить нулевой терминатор для вас. strncpy нуждается в некотором уходе для безопасного использования.

Нет нулевого символа неявно добавляется в конце пункта назначения, если
источник длиннее чем num ..

Просто для начала … есть и другие более глубокие проблемы, упомянутые в комментариях.

1

Другие решения

Начать с общего эквивалента malloc / free — new / delete (выделение кучи памяти).

Во-вторых, вы, кажется, путаете строки и c_strings (старый добрый char *). getline использует строки, ваша функция синтаксического анализа использует c_strings, это не одно и то же, и есть .c_str () функция-член string для выполнения преобразования.

0

Итак, я пытаюсь получить этот код для анализа каждой строки, введенной из
файл в отдельные токены, затем добавьте каждый по очереди в tklist
массив.

За

каждая строка, введенная из файла

использование

std::ifstream ifs;
std::string s;
/**/
std::getline(ifs, s);

принят к вашей петле.

к

разбирать [..] на отдельные токены

посмотри как
станд :: строка
может помочь вам в этой задаче (или использовать повышение :: Tokenizer).

И это

затем добавьте каждый [токен] по очереди в массив tklist.

почти плачет по std :: list или std :: vector вместо простого массива C, выбор зависит от того, какой контейнер использовать, например. о том, что вы собираетесь делать с найденными токенами.

0
По вопросам рекламы [email protected]