Как мне преобразовать массив символов с ненулевым символом в конце в строку? - PullRequest
3 голосов
/ 20 октября 2010

У меня есть функция, которая принимает указатель на серию символов. Я хочу скопировать 256 символов из этой точки и поместить их в строку.

msg не заканчивается нулем.

Код ниже, кажется, вызывает у меня некоторые проблемы. Есть ли правильный способ сделать это?

Init( msg: PCHAR)
var
 myStr: String;
begin
 for i:= 1 to 256 do
 begin
  myStr[i] := msg[i-1]; 
 end;
end;

Ответы [ 4 ]

13 голосов
/ 20 октября 2010
SetString(myStr, msg, 256);
3 голосов
/ 20 октября 2010

Ваш код пропускает SetLength, исправленная версия:

Init( msg: PCHAR)
var
 myStr: String;
begin
 SetLength(myStr, 256);
 for i:= 1 to 256 do
 begin
  myStr[i] := msg[i-1]; 
 end;
end;

Задание может быть выполнено более эффективно, как уже отвечено.

Обновлено

SetLength выделяет 256 символов + завершающий 0 для myStr; без SetLength ваш код является ошибкой: он пишет по дикому адресу и в конечном итоге приведет к нарушению доступа.

2 голосов
/ 20 октября 2010

Если msg заканчивается нулем, как и должно быть, и за 256 символами, которые вы хотите получить, следует нулевой символ, просто выполните

myStr := msg;

Если msg длиннее, вы можете просто сделать

myStr := Copy(msg, 1, 256);

В этом случае лучшим методом будет

myStr := WideCharLenToString(msg, 256);

при условии, что вы используете Delphi 2009 или более позднюю версию, в которой строки являются Unicode.

0 голосов
/ 20 октября 2010

myStr: = Copy (msg, 1, 256);

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