Указатель на строку - C - PullRequest
       0

Указатель на строку - C

0 голосов
/ 24 октября 2011

Я анализирую текстовый файл, и когда я сталкиваюсь со словом .word, я хочу взять остальную часть строки.Вот что у меня есть:

char *word_ptr;

if (strstr(token, ":")){
    // Some code

}

else if ((word_ptr = strstr(token, ".word"))) {
    char *string_wanted = word_ptr + 6;
    printf("Rest: '%s'\n", string_wanted);
}

string_wanted не печатает правильно.Правильно ли мое использование word_ptr при назначении его в операторе else-if?string_wanted ничего не печатает.Когда я добавляю 7 вместо 6, он выводит «ize».У меня был размер слова в моем текстовом файле, но теперь я удалил его, я удалил файл и заново создал его и сделал чистую сборку, и слово «ize» все еще появляется !!Он больше не существует в файле, так откуда он взялся?Я действительно разочарован тем, что слово «размер» больше не существует в файле.

Вот что выглядел файл (когда у меня было слово «ize»):

array: .word 0:10
array_size: .word 10

СейчасЯ только что удалил вторую строку, так что это: array: .word 0:10

Почему word_ptr не печатает 0:10, когда я добавляю к нему 6?Я уверен, что word_ptr указывает на .word, потому что когда я его печатаю, он печатает .word.При токенизации линии array: токенизируется, так что я знаю, что она туда попала.

Есть предложения?

Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 24 октября 2011

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

В этом случае строка:

array: .word 0:10

становится тремя новыми строками:

"массив:"

". Word"

"0:10"

Если вы зацикливаете свои токены (кажется, что вы это делаете), то первый раз в цикле token будет «массив:», во второй раз это будет «.word», а третийвремя будет "0:10".

Эта оценка:

word_ptr = strstr(token, ".word")

найдет ".word" только во время итерации, в которой token содержит ".word".Когда вы увеличиваете word_ptr на 6 символов, вы пересекаете конец token в неопределенную память.Да, «0:10» появляется на два символа после «.word» в вашей исходной строке, но мы не смотрим на исходную строку в вашем вызове strstr.Мы смотрим только на token и token содержит только ".word".

Вот почему он терпит неудачу.Как это исправить, зависит от остальной части вашей реализации.

2 голосов
/ 24 октября 2011

Когда вы устанавливаете *string_wanted на word_ptr + 6, вы указываете string_wanted на null, который завершает строку. Поэтому, когда вы пытаетесь напечатать *string_wanted, вы получаете пустую строку. Попробуйте вместо этого получить следующий токен.

0 голосов
/ 24 октября 2011

Не будет ли ваш if (strstr(token, ":")) верным для всех ваших строк? Он никогда не попадет в блок кода, о котором вы спрашиваете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...