Итак, я пытаюсь получить этот код для анализа каждой строки, введенной из файла, в отдельные токены, а затем добавить каждую по очереди в массив 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;
}
Как я уже сказал, когда я отлаживаю, это похоже на проблему с копированием, но я новичок, поэтому я подозреваю, что я делаю что-то не так.
Спасибо за любую помощь, вы можете дать!
Попробуйте что-то вроде
tklist[count][toklength]='\0';
после
strncpy(tklist[count], &cline[i-toklength], toklength);
strncpy () не обязательно добавить нулевой терминатор для вас. strncpy нуждается в некотором уходе для безопасного использования.
Нет нулевого символа неявно добавляется в конце пункта назначения, если
источник длиннее чем num ..
Просто для начала … есть и другие более глубокие проблемы, упомянутые в комментариях.
Начать с общего эквивалента malloc / free — new / delete (выделение кучи памяти).
Во-вторых, вы, кажется, путаете строки и c_strings (старый добрый char *). getline использует строки, ваша функция синтаксического анализа использует c_strings, это не одно и то же, и есть .c_str () функция-член string для выполнения преобразования.
Итак, я пытаюсь получить этот код для анализа каждой строки, введенной из
файл в отдельные токены, затем добавьте каждый по очереди в tklist
массив.
За
каждая строка, введенная из файла
использование
std::ifstream ifs;
std::string s;
/**/
std::getline(ifs, s);
принят к вашей петле.
к
разбирать [..] на отдельные токены
посмотри как
станд :: строка
может помочь вам в этой задаче (или использовать повышение :: Tokenizer).
И это
затем добавьте каждый [токен] по очереди в массив tklist.
почти плачет по std :: list или std :: vector вместо простого массива C, выбор зависит от того, какой контейнер использовать, например. о том, что вы собираетесь делать с найденными токенами.