1

我做了一个控制台程序,但问题是它不允许插入参数。所以我想知道如何将单个字符串拆分为多个字符串以实现我所需要的。例如:text="msg Hello"将被拆分为textA="msg"textB="Hello"

这是迄今为止的主要控制台代码(只是为了展示这个想法):

if (keyboard_check_pressed(vk_enter)) {
    text_console_c = asset_get_index("scr_local_"+string(keyboard_string));
    if (text_console_c > -1) {
        text_console+= "> "+keyboard_string+"#";
        script_execute(text_console_c);
        text_console_c = -1;
    }
    else if (keyboard_string = "") {
        text_console+= ">#";
    }
    else {
        text_console+= "> Unknown command: "+keyboard_string+"#";
    };

    keyboard_string = "";
}
4

2 回答 2

2

我不建议使用 char 迭代拆分字符串,因为当您尝试拆分非常非常长的字符串时,拆分的时间很长,并且可以在短/长时间内冻结线程。Game maker 目前是单线程的。这段代码要快得多。

string_split

var str = argument[0] //string to split
var delimiter = argument[1] // delimiter
var letDelimiter = false // append delimiter to each part
if(argument_count == 3)
    letDelimiter = argument[2]
var list = ds_list_create()
var d_at = string_pos(delimiter, str)
while(d_at > 0) {
    var part = string_delete(str, d_at , string_length(str))
    if(letDelimiter)
        part = part + delimiter
    str = string_delete(str, 1, d_at)
    d_at = string_pos(delimiter, str)
    ds_list_add(list, part)
    if(d_at == 0 && str != "")//last string without delimiter, need to add too
        ds_list_add(list, str)
}
return list;

迭代所有字符串后不要忘记ds_list_destroy,例如:

var splited = string_split("first part|second part", '|')
for(splited) {
//do something with each string
}
ds_list_destroy(splited)
于 2015-09-04T15:27:45.597 回答
0

像这样的东西可能会有所帮助,但尚未对其进行测试,但如果您可以了解正在发生的事情,那么它是一个很好的起点。

Text = "msg Hello"
counter = 0
stringIndex = 0
for (i = 0; i < string_length(text); i++)
{
    if string_char_at(text,i) == " "
    {
        counter++
        stringIndex = 0
    } else {
        string_insert(string_char_at(text,i),allStrings(counter),stringIndex)
        stringIndex++
    }
}

allStrings 应该是一个包含每个单独字符串的数组。每当看到“”时,allStrings 的下一个索引开始填充它的字符。 stringIndex 用于添加渐进字符。

于 2014-07-01T23:25:06.190 回答