====== Strings ====== Strings are fixed-length series of PETSCII characters. The maximum length of a string is 96 characters. ===== String literals ===== String literals must be enclosed between double quote (''"'') characters and may contain any ASCII character. Every ASCII character that has a PETSCII equivalent will be translated to PETSCII. For characters that don't have an ASCII equivalent, you can use PETSCII escape sequences. An escape sequence is a number or an alias in curly braces. For example: PRINT "{CLR}" : REM clear screen PRINT "{147}" : REM same as above PRINT "{WHITE}text in white" Refer to [[:petscii_escape_sequences|this page]] for all supported escape sequences. ===== Defining string variables ===== As opposed to numeric variables, string variables cannot be implicitly defined. You must use the ''DIM'' keyword to create a variable of STRING type. The statement must define the variable name, the type, and the maximum string length, as in this example: DIM varname$ AS STRING * 16 This will create a STRING variable named ''varname$'' with a maximum length of 16 characters. The ''$'' postfix in the variable name is optional and may be omitted. The maximum allowed string length is 96 characters. ===== Value assignment ===== Variables of STRING type, just like any other variables, may be assigned values using the ''='' operator: varname$ = "hello world" There's one caveat that you must be aware of: if the right-hand side of the assignment is longer than the variable's maximum length, the string will be truncated to fit into the variable. For example: DIM varname$ AS STRING * 5 varname$ = "hello world" PRINT varname$ : REM will output "hello" Strings will be truncated to the maximum length that will fit into the variable. So if a STRING variable was defined with a length of 32, for example, then only the first 32 string characters of the assigned value will be stored. ===== String operators ===== Use the ''+'' operator to concatenate two strings. DIM name$ AS STRING * 16 DIM greet$ AS STRING * 23 INPUT "enter your name: "; name$ greet$ = "hello, " + name$ You can use the comparison operators ''='' and ''<>'' to verify two strings are identical. ===== String functions ===== You can find all functions that operate on strings on the [[functionref]] page. ===== Direct string manipulation ===== If you intend to manipulate strings directly, for example to examine and/or replace individual characters, you may use [[PEEK]] and [[POKE]] to read and write individual characters within strings. For this you must understand how strings are stored in memory. When you define a string variable, as in this example: DIM mystr$ AS STRING * 8 ...the compiler will allocate 9 bytes in memory - one for holding the string length, and the rest for the characters that make up the string value. Now when you assign a value to this variable, such as: mystr$ = "hello" ...the memory area will be set like this (numbers in hexadecimal): {{:v3:str_hello.png?nolink&400|}} The first byte will contain the string length (five characters in this case) and the following 5 bytes will represent the encoded PETSCII characters. Since the fixed size of this string is 8 characters, but the actual string is only 5 characters long, the last three bytes are unused and their values are undefined and insignificant. However, XC=BASIC does not perform "garbage collection" like some others languages do, so those 3 bytes will remain in memory for the entire runtime of the program as unused space unless you alter the string by assigning a new value. Therefore, for the sake of efficient memory use, it is best to ensure all strings are defined to a length that is as short as possible for the needs of the program. The "@" operator returns the memory address of a variable. With this address, you can easily manipulate the string. For example, you can change its first character to an "A", as in the following example: POKE @mystr$ + 1, 65 PRINT mystr$ Here is how the compiler will handle this example: * The expression ''@mystr$'' will be resolved to the address of ''mystr$'' as a WORD. This is the 1st byte of the string in memory, the one that holds the length of the string. * Adding 1 will resolve to the first character of the string (2nd byte). * The number 65 is the PETSCII-code of the letter 'A' If the above code is compiled and run, the output will be "AELLO". <- expressions|Previous page ^ strings|Strings ^ flowcontrol|Next page ->