Как узнать правильную длину для чтения строки при чтении из адреса памяти? - PullRequest
0 голосов
/ 03 февраля 2019

Итак, у меня проблема: я читаю строку с адреса памяти, который отличается в разное время.Например:

Axe?ca Ocarina?tar??ing?ing????????????

Мне нужен только топор.

Ball of Green Yarn??ing?ing????????????

Мне нужен только шар зеленой пряжи.

Я читаю 80 байт текста (40chars), потому что это наибольшее количество символов, которое должна получить строка.Но как я могу узнать, какова длина строки на самом деле?

1 Ответ

0 голосов
/ 03 февраля 2019

Это действительно зависит от того, что пишет строка.

Как правило, строки заканчиваются NUL, то есть символ '\0' следует сразу за строкой.Старый стиль (не _s -вариант) Функции C, такие как strlen и strcat, используют это для определения конца существующих строк и отметки конца измененных строк.

Большинство строковых типов данных, как правило, работают таким образом, но не все.В Turbo Pascal строки имеют префикс длины.BSTR, используемые в COM (включая pre-.NET VB), оба.

На основании примеров, которые вы показали, есть большая вероятность, что символ ?, который вы видите после частиВы хотите, это NUL персонаж.Похоже, что буфер используется повторно и повторно завершается каждый раз, например, более короткая строка, такая как «Ax», была записана поверх более длинной строки, как определенный вид окарины.

Проверьте буфер в отладчике, и выВероятно, вы найдете символ '\0', следующий сразу за тем, что вам нужно.

Вероятно. Опять же, это зависит от того, что пишет строка.Пока вы не посмотрите на себя, это может быть что угодно, и даже тогда, это может быть просто совпадением, что это NUL-завершенный на этот раз .Не полагайтесь только на наблюдение.Без документации это могло бы быть иначе и все еще столь же верно. Что бы вы ни делали , не читайте за 40-символьным буфером, который, как вы знаете, у вас , NUL завершен или нет.

...