эта проблема, я думаю, связана исключительно с проблемой выделения памяти.
(возможно, перейдите к нижней части и прочитайте последний вопрос для некоторых простых предложений)
Я пишу эту программу, которая читает файлы, введенные пользователем. Если файл «включает» другие файлы, то они также будут прочитаны. Чтобы проверить, содержит ли файл другой файл, я анализирую первое слово строки. Для этого я написал функцию, которая возвращает проанализированное слово, и передается указатель, который устанавливается на первую букву следующего слова. Например, рассмотрим строку:
"include foo" NOTE файлы могут включать только 1 другой файл
firstWord == включить, chPtr == f
Мой алгоритм анализирует firstWord для проверки на равенство строк с помощью команды include, затем он анализирует второе слово, чтобы проверить правильность файла и выяснить, был ли файл уже прочитан.
Теперь моя проблема в том, что многие файлы читаются, а chPtr перезаписывается. Итак, когда я возвращаю указатель на следующее слово. Следующее слово иногда будет содержать последние несколько символов предыдущего файла. Рассмотрим примеры файлов с именем testfile-1 и bogus:
Пусть chPtr изначально равен testfile-1 и теперь рассмотрим синтаксический анализ 'include bogus':
извлечение firstWord будет == включать, и chPtr будет перезаписан, чтобы указывать на b в фиктивном. Таким образом, chPtr будет равен b \ g 's' \ 0 'l e - 1. l e - 1 - это последние несколько символов testfile-1, поскольку chPtr указывает на один и тот же адрес памяти каждый раз, когда вызывается моя функция. Это проблема для меня, потому что когда я разбираю фальшивку, chPtr будет указывать на l. Вот код для моей функции:
char* extract_word(char** chPtr, char* line, char parseChar)
//POST: word is returned as the first n characters read until parseChar occurs in line
// FCTVAL == a ptr to the next word in line
{
int i = 0;
while(line[i] != parseChar && line[i] != '\0')
{
i++;
}
char* temp = Malloc(i + 1); //I have a malloc wrapper to check validity
for(int j = 0; j < i; j++)
{
temp[j] = line[j];
}
temp[i+1] = '\0';
*chPtr = (line + i + 1);
char* word = Strdup(temp); //I have a wrapper for strdup too
return word;
Итак, мой диагноз проблемы правильный? Если да, делаю ли я глубокие копии chPtr? Кроме того, как мне сделать глубокие копии chPtr?
Большое спасибо!