Если необходимо копировать заранее известное количество данных,
то лучше это делать в статически выделенный буфер,
чтобы избежать излишнего перевыделения памяти.
voidOnStart()
{
//---string to_split="мама_мыла_раму"; // строка для разбивки на подстрокиstring sep="_"; // раздедитель в виде символаushort u_sep; // код символа разделителяstring result[3]; // массив для получения строк//ArrayResize(result,3); //--- получим код разделителя
u_sep=StringGetCharacter(sep,0);
//--- разобьем строку на подстрокиint k=StringSplit(to_split,u_sep,result);
Print("GetLastError=",GetLastError()); // это я добавил чтоб видеть есть ли ошибка
//--- выведем комментарий PrintFormat("Получено строк: %d. Использован разделитель '%s' с кодом %d",k,sep,u_sep);
//--- теперь выведем все полученные строкиif(k>0)
{
for(int i=0;i<k;i++)
{
PrintFormat("result[%d]=%s",i,result[i]);
}
}
}
是的,如果你删除了最多3个字母
这不是问题的关键。尽量根据自己的需要研究这个或那个主题。一旦你的系统到了需要某些 "杠杆"(功能)的地步,就开始尝试使用这些杠杆。我发现这种学习方法(在我的情况下)效果相当好))。
然后我们等待更多有能力的同志的回应))。
等等 :)
更好的是,不要等待)。继续实验。))
在声明数组时,从数组中删除该值。这一定是像在帮助。
string result[];
而且你不会有任何错误。按照我的理解,to_split 变量中指定的整个字符串被放在数组中, 然后再进行子串提取。更好的是,不要等待)。继续实验。))
在声明数组时,从数组中删除该值。这一定是帮助中的写法。
而且不会有任何错误。根据我的理解,to_split 变量中指定的整个字符串被放在数组中, 然后进行子串提取。这很清楚。只是这是一个潜在的陷阱--我在我的代码中确实遇到了这个错误,而且它还能工作--有一个错误。
例如,这里是CopyBuffer的帮助文本
我的意思是,与StringSplit有什么区别呢?
而如果你把所有的数组都变成动态的,你的内存就会耗尽。
当然,带有归零功能的Upgr ArrayResize是一种变体,但我不喜欢它。
按照我的理解,to_split 变量中指定的整个字符串被放在数组中, 然后提取子串。
在你的例子中,问题在于StringSplit()函数本身照顾到了作为参数传递的数组中的所需内存量。
因此,事实证明,静态数组 可以工作(如果有足够的内存),但会导致错误,因为人们试图重新划分它。
只要试试静态和分布式动态数组,你就知道了。
试着用静态和分布式动态数组的变体,它就会变得很清楚。
要尝试动态数组,只需取消ArrayResize(result,3); ?如果是这样,在编译时将有一个警告。
要尝试一个动态数组,只需解开ArrayResize(result,3); ?如果是这样,就有一个关于编译的警告。
这是一个无法解决的问题吗? 使其成为动态的。
在你的例子中,问题在于StringSplit()函数本身照顾到了作为参数传递的数组中的所需内存量。
这就是为什么静态数组 可以工作(如果有足够的内存),但会导致错误,因为人们试图重新划分它。
那么,我们到底能不能在静态数组中使用StringSplit()?
如果你可以,如果有足够的内存,就不应该有错误。如果没有,就不应该工作。