PDA

Просмотр полной версии : [Вопрос] Строки-массивы и символы-ячейки



Josan_Solomon
24.11.2018, 14:29
Hello, World! Не обессудьте столь примитивный вопрос, но как грамотно придать строке значение другой строки? Например, есть строка new name[MAX_PLAYER_NAME] и значения у нее нет. Тогда все просто, name=GetPlayerName(playerid); Но если там уже присутствует значение, почему-то не получается так просто приравнять, хотя по идее массивы можно приравнивать, если типы и размеры совпадают. Кто-то делает через функции строк strmid, strins и тд, кто-то через format, а мне бы хотелось знать наиболее грамотный вариант. И да, имеет ли значение то, что сама name находится в массиве (наподобие player_info)?

Seviel
24.11.2018, 14:41
Прошу прощения.



public OnGameModeInit()
{
new str[23];
replace_string(str, "Это шутка");
print(str);
return 1;
}

stock replace_string(string1[], const string2[], const size1 = sizeof(string1), const size2 = sizeof(string2))
{
new
size = size1,
count
;
if(size > size2) size = size2;
for(new i; i < size; i++)
{
if(string2[i] == '\0') break;
string1[i] = string2[i];
count++;
}
string1[count] = '\0';
return count + 1;
}

DeimoS
24.11.2018, 14:48
Прошу прощения.



public OnGameModeInit()
{
new str[23];
replace_string(str, "Это шутка");
print(str);
return 1;
}

stock replace_string(string1[], const string2[], const size1 = sizeof(string1), const size2 = sizeof(string2))
{
new
size = size1,
count
;
if(size > size2) size = size2;
for(new i; i < size; i++)
{
if(string2[i] == '\0') break;
string1[i] = string2[i];
count++;
}
string1[count] = '\0';
return count + 1;
}


А strcat, strins, format и прочие функции для работы со строками (https://wiki.sa-mp.com/wiki/%D0%94%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3%D0%B0#.D0.A1.D1.82.D1.80.D0.BE.D0.BA.D0.BE.D0.B2.D1.8B.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.28string.inc.29) нынче вне закона?

Seviel
24.11.2018, 14:49
А strcat, strins, format и прочие функции для работы со строками (https://wiki.sa-mp.com/wiki/%D0%94%D1%80%D1%83%D0%B3%D0%B8%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3%D0%B0#.D0.A1.D1.82.D1.80.D0.BE.D0.BA.D0.BE.D0.B2.D1.8B.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.28string.inc.29) нынче вне закона?

Я велосипедист.

Josan_Solomon
25.11.2018, 01:27
Вот я и спрашиваю, почему для строк нужно использовать подобные команды, в то время как целочисленные массивы, каковыми строки и являются, можно приравнивать обычным выражением a=b

DeimoS
25.11.2018, 12:38
Вот я и спрашиваю, почему для строк нужно использовать подобные команды, в то время как целочисленные массивы, каковыми строки и являются, можно приравнивать обычным выражением a=b

Эмм, в Pawn строки - те же самые целочисленные массивы. И приравнивание действует по тем же правилам: если массив, в который идёт запись, размером больше или равен массиву, значения которого записываются, то запись произойдёт. Иначе компилятор ругнётся на то, что размер первого массива слишком мал.

То бишь:
//Не ок
new array1[7] = "DeimoS";
new array2[6];
array2 = array1;
printf("|%s|%s|", array1, array2);

//Ок
new array1[7] = "DeimoS";
new array2[7];
array2 = array1;
printf("|%s|%s|", array1, array2);

//Ок
new array1[7] = "DeimoS";
new array2[142];
array2 = array1;
printf("|%s|%s|", array1, array2);

Josan_Solomon
25.11.2018, 14:05
Но через какое-то количество перезаписываний строки она вдруг просто перестанет записываться. У вас такого не было? Когда приходится пользоваться функциями для изменения значений глобальных строк

DeimoS
25.11.2018, 14:10
Скорее всего проблема в коде, а не в перезаписи