String prepend
Create a string variable equal to any text value.

You are encouraged to solve this task according to the task description, using any language you may know.
Basic Data Operation
This is a basic data operation. It represents a fundamental action on a basic data type.
You may see other such operations in the Basic Data Operations category, or:
Integer Operations
Arithmetic |
Comparison
Boolean Operations
Bitwise |
Logical
String Operations
Concatenation |
Interpolation |
Comparison |
Matching
Memory Operations
Pointers & references |
Addresses
- Task
Prepend the string variable with another string literal.
If your language supports any idiomatic ways to do this without referring to the variable twice in one expression, include such solutions.
To illustrate the operation, show the content of the variable.
V s = ‘12345678’
s = ‘0’s
print(s)- Output:
012345678
* String prepend - 14/04/2020
PREPEND CSECT
USING PREPEND,13 base register
B 72(15) skip savearea
DC 17F'0' savearea
SAVE (14,12) save previous context
ST 13,4(15) link backward
ST 15,8(13) link forward
LR 13,15 set addressability
MVC C+L'B(L'A),A c=a
MVC C(L'B),B c=b+c (prepend)
XPRNT C,L'C print buffer
L 13,4(0,13) restore previous savearea pointer
RETURN (14,12),RC=0 restore registers from calling sav
A DC C'world!' a
B DC C'Hello ' b
C DC CL80' ' c
END PREPEND- Output:
Hello world!
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program appendstr64.s */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
/*******************************************/
/* Initialized data */
/*******************************************/
.data
szMessString: .asciz "British Museum.\n"
szComplement: .skip 80
szStringStart: .asciz "The rosetta stone is at "
szCarriageReturn: .asciz "\n"
/*******************************************/
/* UnInitialized data */
/*******************************************/
.bss
/*******************************************/
/* code section */
/*******************************************/
.text
.global main
main:
ldr x0,qAdrszMessString // display message
bl affichageMess
ldr x0,qAdrszMessString
ldr x1,qAdrszStringStart
bl prepend // append sting2 to string1
ldr x0,qAdrszMessString
bl affichageMess
ldr x0,qAdrszCarriageReturn
bl affichageMess
100: // standard end of the program
mov x0,0 // return code
mov x8,EXIT // request to exit program
svc 0 // perform system call
qAdrszMessString: .quad szMessString
qAdrszStringStart: .quad szStringStart
qAdrszCarriageReturn: .quad szCarriageReturn
/**************************************************/
/* append two strings */
/**************************************************/
/* x0 contains the address of the string1 */
/* x1 contains the address of the string2 */
prepend:
stp x1,lr,[sp,-16]! // save registers
mov x3,#0 // length counter
1: // compute length of string 1
ldrb w4,[x0,x3]
cmp w4,#0
cinc x3,x3,ne // increment to one if not equal
bne 1b // loop if not equal
mov x5,#0 // length counter insertion string
2: // compute length of insertion string
ldrb w4,[x1,x5]
cmp x4,#0
cinc x5,x5,ne // increment to one if not equal
bne 2b
cmp x5,#0
beq 99f // string empty -> error
add x3,x3,x5 // add 2 length
add x3,x3,#1 // +1 for final zero
mov x6,x0 // save address string 1
mov x0,#0 // allocation place heap
mov x8,BRK // call system 'brk'
svc #0
mov x5,x0 // save address heap for output string
add x0,x0,x3 // reservation place x3 length
mov x8,BRK // call system 'brk'
svc #0
cmp x0,#-1 // allocation error
beq 99f
mov x4,#0 // counter byte string 2
3:
ldrb w3,[x1,x4] // load byte string 2
cbz x3,4f // zero final ?
strb w3,[x5,x4] // store byte string 2 in heap
add x4,x4,1 // increment counter 1
b 3b // no -> loop
4:
mov x2,#0 // counter byte string 1
5:
ldrb w3,[x6,x2] // load byte string 1
strb w3,[x5,x4] // store byte string in heap
cbz x3,6f // zero final ?
add x2,x2,1 // no -> increment counter 1
add x4,x4,1 // no -> increment counter 2
b 5b // no -> loop
6: // recopie heap in string 1
mov x2,#0 // counter byte string
7:
ldrb w3,[x5,x2] // load byte string in heap
strb w3,[x6,x2] // store byte string 1
cbz x3,100f // zero final ?
add x2,x2,1 // no -> increment counter 1
b 7b // no -> loop
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"- Output:
British Museum. The rosetta stone is at British Museum.
PROC Append(CHAR ARRAY text,suffix)
BYTE POINTER srcPtr,dstPtr
BYTE len
len=suffix(0)
IF text(0)+len>255 THEN
len=255-text(0)
FI
IF len THEN
srcPtr=suffix+1
dstPtr=text+text(0)+1
MoveBlock(dstPtr,srcPtr,len)
text(0)==+suffix(0)
FI
RETURN
PROC Prepend(CHAR ARRAY text,prefix)
CHAR ARRAY tmp(256)
SCopy(tmp,text)
SCopy(text,prefix)
Append(text,tmp)
RETURN
PROC TestPrepend(CHAR ARRAY text,preffix)
PrintF("Source ""%S"" at address %H%E",text,text)
PrintF("Prepend ""%S""%E",preffix)
Prepend(text,preffix)
PrintF("Result ""%S"" at address %H%E",text,text)
PutE()
RETURN
PROC Main()
CHAR ARRAY text(256)
text(0)=0
TestPrepend(text,"World!")
TestPrepend(text,"Hello ")
RETURN- Output:
Screenshot from Atari 8-bit computer
Source "" at address $2A8A Prepend "World!" Result "World!" at address $2A8A Source "World!" at address $2A8A Prepend "Hello " Result "Hello World!" at address $2A8A
In Ada, a variable of type String cannot change its length. So the variable S which we will change, need to be of the type Unbounded_String. Thus the need for conversions from String literal to Unbounded_String for initialization, and from Unbounded_String to String for printing.
with Ada.Text_IO; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
procedure Prepend_String is
S: Unbounded_String := To_Unbounded_String("World!");
begin
S := "Hello " & S;-- this is the operation to prepend "Hello " to S.
Ada.Text_IO.Put_Line(To_String(S));
end Prepend_String;
- Output:
Hello World!
File: String_prepend.a68
#!/usr/bin/a68g --script #
# -*- coding: utf-8 -*- #
STRING str := "12345678";
"0" +=: str;
print(str)- Output:
012345678
AppleScript text is immutable, so prepending is only possible by creating a new text through concatenation of the variable's existing contents to the other string:
set aVariable to "world!"
set aVariable to "Hello " & aVariable
return aVariable
- Output:
"Hello world!"
It's a similar situation with NSString class in AppleScriptObjC. This has various ways of achieving the same thing, probably the most sensible of which is the first of the following:
use AppleScript version "2.4" -- OS X 10.10 (Yosemite) or later
use framework "Foundation"
set aVariable to current application's class "NSString"'s stringWithString:("world!")
set aVariable to aVariable's stringByReplacingCharactersInRange:({0, 0}) withString:("Hello ")
-- return aVariable as text
-- Or:
set aVariable to current application's class "NSString"'s stringWithString:("world!")
set aVariable to current application's class "NSString"'s stringWithFormat_("%@%@", "Hello ", aVariable)
-- return aVariable as text
-- Or:
set aVariable to current application's class "NSString"'s stringWithString:("world!")
set aVariable to aVariable's stringByReplacingOccurrencesOfString:("^") withString:("Hello ") ¬
options:(current application's NSRegularExpressionSearch) range:({0, 0})
-- return aVariable as text
But there's also an NSMutableString class. This has 'replace' versions of the 'stringByReplacing' methods above and also this insertString:atIndex: method:
use AppleScript version "2.4" -- OS X 10.10 (Yosemite) or later
use framework "Foundation"
set aVariable to current application's class "NSMutableString"'s stringWithString:("world!")
tell aVariable to insertString:("Hello ") atIndex:(0)
return aVariable as text
- Output:
"Hello world!"
(let s "012345678")
(let v (+ "#~" s))
(print v)- Output:
#~012345678
/* ARM assembly Raspberry PI */
/* program preend.s */
/* REMARK 1 : this program use routines in a include file
see task Include a file language arm assembly
for the routine affichageMess conversion10
see at end of this program the instruction include */
/*******************************************/
/* Constantes */
/*******************************************/
.include "../constantes.inc"
.equ NBCARLIBEL, 45
.equ BUFFERSIZE, 100
/*******************************************/
/* Macros */
/*******************************************/
//.include "../../ficmacros32.inc" @ for developer debugging
/*******************************************/
/* Initialized data */
/*******************************************/
.data
szMessDebutPgm: .asciz "Program 32 bits start. \n"
szCarriageReturn: .asciz "\n"
szMessFinOK: .asciz "Program normal end. \n"
szMessString: .asciz "British Museum.\n"
szStringStart: .asciz "The rosetta stone is at "
szMessErrSize: .asciz "Buffer error size too small.\n"
/*******************************************/
/* UnInitialized data */
/*******************************************/
.bss
sBuffer: .skip BUFFERSIZE
.align 4
/*******************************************/
/* code section */
/*******************************************/
.text
.global main
main:
ldr r0,iAdrszMessDebutPgm
bl affichageMess
ldr r0,iAdrszMessString
ldr r1,iAdrszStringStart
ldr r2,iAdrsBuffer
mov r3,#BUFFERSIZE
bl prepend // preend string1 to string2
cmp r0,#-1
beq 100f
ldr r0,iAdrszMessString
bl affichageMess
ldr r0,iAdrsBuffer
bl affichageMess
ldr r0,iAdrszMessFinOK
bl affichageMess
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc 0 @ perform system call
iAdrszMessDebutPgm: .int szMessDebutPgm
iAdrszMessFinOK: .int szMessFinOK
iAdrszCarriageReturn: .int szCarriageReturn
iAdrszMessString: .int szMessString
iAdrszStringStart: .int szStringStart
iAdrsBuffer: .int sBuffer
/**************************************************/
/* preend two strings */
/**************************************************/
/* r0 contains the address of the string1 */
/* r1 contains the address of the string2 */
/* r2 contains buffer */
/* r3 contains buffer size */
prepend:
push {r4-r6,fp,lr}
mov r4,#0 // counter byte string 2
mov r5,#0 // result byte counter
1: // copy string 2 in result area
ldrb r6,[r1,r4]
cmp r6,#0
beq 2f
strb r6,[r2,r5]
add r4,r4,#1 // increment indice
add r5,r5,#1 // increment indice
cmp r5,r3
bge 99f // error size
b 1b // and loop
2:
mov r4,#0 // counter byte string1
3:
ldrb r6,[r0,r4]
strb r6,[r2,r5]
cmp r6,#0
beq 4f
add r4,r4,#1 // increment indice
add r5,r5,#1 // increment indice
cmp r5,r3
bge 99f // error size
b 3b // and loop
4:
mov r0,r5
b 100f
99:
ldr r0,iAdrszMessErrSize
bl affichageMess
mov r0,#-1 // error
100:
pop {r4-r6,fp,pc}
iAdrszMessErrSize: .int szMessErrSize
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../affichage.inc"Program 32 bits start. British Museum. The rosetta stone is at British Museum. Program normal end.
a: "World"
a: "Hello" ++ a
print a
b: "World"
b: append "Hello" b
print a
c: "World"
prefix 'c "Hello"
print c
d: "World"
print prefix d "Hello"
- Output:
HelloWorld HelloWorld HelloWorld HelloWorld
string s1 = " World!";
write("Hello" + s1);
write("Hello", s1);
string s2 = "Hello" + s1;
write(s2);
s := "foo"
s := s "bar"
Msgbox % s
- Output:
foobar
# syntax: GAWK -f STRING_PREPEND.AWK
BEGIN {
s = "bar"
s = "foo" s
print(s)
exit(0)
}
- Output:
foobar
s$ = "prepend"
s$ = "String " & s$
PRINT s$- Output:
String prepend
S$ = " World!"
S$ = "Hello" + S$
PRINT S$- Output:
Hello World!
100 LET S$=" World!"
110 LET S$="Hello"+S$
120 PRINT S$a$ = " World!"
a$ = "Hello"; a$
print a$
# would also be valid
a$ = "Hello" + a$
# and
a$ = "Hello" & a$10 A$ = " World!"
20 A$ = "Hello" + A$
30 PRINT A$
10 A$ = " World!"
20 A$ = "Hello" + A$
30 PRINT A$
100 LET S$=" World!"
110 LET S$="Hello"&S$
120 PRINT S$10 A$ = " World!"
20 A$ = "Hello" + A$
30 PRINT A$
a$ = " World!"
a$ = "Hello" + a$
print a$
' en RB, LB and BASIC256 would also be valid
a$ = "Hello"; a$10 LET A$ = " World!"
20 LET A$ = "Hello" + A$
30 PRINT A$
LET a$ = " World!"
LET a$ = "Hello" & a$
PRINT a$
END
a$ = " World!"
a$ = "Hello" + a$
print a$
BLC program
18 16 46 80 05 bc bc fd f6 e0 67 6d 61
based on https://github.com/tromp/AIT/blob/master/rosetta/catstrings.lam prepends "ma" to "gma" to output "magma".
World!:?string
& str$("Hello " !string):?string
& out$!stringHello World!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str[100]="my String";
char *cstr="Changed ";
char *dup;
sprintf(str,"%s%s",cstr,(dup=strdup(str)));
free(dup);
printf("%s\n",str);
return 0;
}
- Output:
Changed my String
using System;
namespace PrependString
{
class Program
{
static void Main(string[] args)
{
string str = "World";
str = "Hello " + str;
Console.WriteLine(str);
Console.ReadKey();
}
}
}
Hello World
include <vector>
#include <algorithm>
#include <string>
#include <iostream>
int main( ) {
std::vector<std::string> myStrings { "prepended to" , "my string" } ;
std::string prepended = std::accumulate( myStrings.begin( ) ,
myStrings.end( ) , std::string( "" ) , []( std::string a ,
std::string b ) { return a + b ; } ) ;
std::cout << prepended << std::endl ;
return 0 ;
}
- Output:
prepended tomy string
A pure function implementation with immutability
(defn str-prepend [a-string, to-prepend]
(str to-prepend a-string))
REPL demonstrations with mutability in mind
a) with the atom data structure
(def s (atom "World"))
(swap! s #(str "Hello, " %))
user=> @s
user=> "Hello, Wolrd"
b) with the ref data structure
(def s (ref "World"))
(dosync (alter s #(str "Hello " %)))
user=> @s
user=> "Hello World"
identification division.
program-id. prepend.
data division.
working-storage section.
1 str pic x(30) value "World!".
1 binary.
2 len pic 9(4) value 0.
2 scratch pic 9(4) value 0.
procedure division.
begin.
perform rev-sub-str
move function reverse ("Hello ") to str (len + 1:)
perform rev-sub-str
display str
stop run
.
rev-sub-str.
move 0 to len scratch
inspect function reverse (str)
tallying scratch for leading spaces
len for characters after space
move function reverse (str (1:len)) to str
.
end program prepend.
Hello World!
>>SOURCE FREE
PROGRAM-ID. prepend.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 str PIC X(30) VALUE "world!".
PROCEDURE DIVISION.
MOVE FUNCTION CONCATENATE("Hello, ", str) TO str
DISPLAY str
.
END PROGRAM prepend.
Classic tag based CFML
<cfoutput>
<cfset who = "World!">
#"Hello " & who#
</cfoutput>
- Output:
Hello World!
Script Based CFML
<cfscript>
who = "World!";
greeting = "Hello " & who;
writeOutput( greeting );
</cfscript>
- Output:
Hello World!
A macro is necessary in order to prepend a string in-place:
(defmacro prependf (s &rest strs)
"Prepend the given string variable with additional strings. The string variable is modified in-place."
`(setf ,s (concatenate 'string ,@strs ,s)))
(defvar *str* "foo")
(prependf *str* "bar")
(format T "~a~%" *str*)
- Output:
barfoo
Strings are immutable in Crystal, so the result of the concatenation needs to be assigned back to the variable. There's no way not to refer to it twice.
s = "world"
s = "Hello " + s
puts s
- Output:
Hello world
import std.stdio;
void main() {
string s = "world!";
s = "Hello " ~ s;
writeln(s);
}
- Output:
Hello world!
program String_preappend;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TStringHelper = record helper for string
procedure Preappend(str: string);
end;
{ TStringHelper }
procedure TStringHelper.Preappend(str: string);
begin
Self := str + self;
end;
begin
var h: string;
// with + operator
h := 'World';
h := 'Hello ' + h;
writeln(h);
// with a function concat
h := 'World';
h := concat('Hello ', h);
writeln(h);
// with helper
h := 'World';
h.Preappend('Hello ');
writeln(h);
readln;
end.
- Output:
Hello World Hello World Hello World
var s = "world!"
s = "Hello " + s
print(s)local :s "world!"
set :s concat( "Hello " s)
!print s- Output:
Hello world!
Prepending to a column
The basic string concatenation operator is `||` and is typically used in SELECT clauses, e.g.
select 'Hello ' || s FROM (select 'world!' as s);
Another possibility would be to use the format() function, e.g.
select format('{} {}', 'Hello', s) FROM (select 'world!' as s);
Prepending to a VARIABLE
set variable s = 'world!';
select 'Hello ' || getvariable('s')
string$ = "Lang"
string$ = "Easy" & string$
print string$- Output:
EasyLang
define-syntax-rule
(set!-string-prepend a before)
(set! a (string-append before a)))
→ #syntax:set!-string-prepend
(define name "Presley")
→ name
(set!-string-prepend name "Elvis ")
name
→ "Elvis Presley"
Port of #sed solution.
s/^/String literal/
ELENA 6.x:
import extensions;
import extensions'text;
public program()
{
var s := "World";
s := "Hello " + s;
console.writeLine(s);
// Alternative way
var s2 := StringWriter.load("World");
s2.insert(0, "Hello ");
console.writeLine(s2);
console.readChar()
}str1 = "World!"
str = "Hello, " <> str1
- Output:
"Hello, World!"
While strings in Emacs Lisp are mutable, they're fixed size. Therefore the concat function creates a new string and the existing string must be referenced twice:
(defvar str "bar")
(setq str (concat "foo" str))
str ;=> "foobar"
This can be hidden by using a macro such as cl-callf2 which expands into the above code:
(require 'cl-lib)
(defvar str "bar")
(cl-callf2 concat "foo" str)
str ;=> "foobar"
Buffers can be thought of as expandable strings:
(let ((buf (get-buffer-create "*foo*")))
(with-current-buffer buf
(insert "bar"))
(with-current-buffer buf
(goto-char (point-min))
(insert "foo")
(buffer-string)))
;; => "foobar"
text greeting = "world"
^|basic concatenation|^
writeLine("hello " + greeting)
^|changing the text in place|^
writeLine(greeting.insert(0, "hello "))
writeLine(greeting)- Output:
hello world hello world hello world
- Output:
1> S = "world". "world" 2> "Hello " ++ S. "Hello world"
......
S$=" World!"
S$="Hello"+S$
PRINT(S$)
......- Output:
Hello World!
let mutable s = "world!"
s <- "Hello, " + s
printfn "%s" s
"world"
"Hello " prepend
VBA/Python programmer's approach not sure if it's the most falconic way
/* created by Aykayayciti Earl Lamont Montgomery
April 9th, 2018 */
s = "fun "
s = s + "Falcon"
> s- Output:
fun Falcon [Finished in 0.2s]
Forth has no string prepend word, but adding it is not difficult. This demonstration starts from the low level operations that Forth gives us and quickly builds a simple set of "WORDS" (sub-routines) that let us move strings from address to address. Strings are just an address on the data stack so we can reference them as many times as we need to. Our prepend word makes use of the Return stack as a temporary storage for the address of the string we want to prepend. Standard Forth also provides a named general purpose buffer called PAD, so we make use of that too. With this PREPEND becomes part of the language.
\ the following functions are commonly native to a Forth system. Shown for completeness
: C+! ( n addr -- ) dup c@ rot + swap c! ; \ primitive: increment a byte at addr by n
: +PLACE ( addr1 length addr2 -- ) \ Append addr1 length to addr2
2dup 2>r count + swap move 2r> c+! ;
: PLACE ( addr1 len addr2 -- ) \ addr1 and length, placed at addr2 as counted string
2dup 2>r 1+ swap move 2r> c! ;
\ Example begins here
: PREPEND ( addr len addr2 -- addr2)
>R \ push addr2 to return stack
PAD PLACE \ place the 1st string in PAD
R@ count PAD +PLACE \ append PAD with addr2 string
PAD count R@ PLACE \ move the whole thing back into addr2
R> ; \ leave a copy of addr2 on the data stack
: writeln ( addr -- ) cr count type ; \ syntax sugar for testing
Test our language extensions interactively at the console
256 buffer: string1 ok s" needs no introduction!" string1 place ok string1 writeln needs no introduction! ok s" This string " string1 prepend writeln This string needs no introduction! ok
Early inability
Early Fortran had almost no ability to manipulate text except via overwriting text literals in a FORMAT statement used in a READ, that would then appear when the same FORMAT statement was used in a WRITE (!) perhaps as a heading.
Initial difficulty
With Fortran IV came the ability to use arrays of integers and the A1 format code in READ and WRITE statements for them. With sixteen-bit integers, one might use A2 and so forth, but the numerical values of the integers would not be convenient especially if the sign bit was involved. This would be even more difficult with floating-point variables. Still, the desire for good headings and annotations and flexible layout flogged one onwards. Following the Pascal "Hello world!" example, one might proceed somewhat as follows:
INTEGER*4 I,TEXT(66)
DATA TEXT(1),TEXT(2),TEXT(3)/"Wo","rl","d!"/
WRITE (6,1) (TEXT(I), I = 1,3)
1 FORMAT ("Hello ",66A2)
DO 2 I = 1,3
2 TEXT(I + 3) = TEXT(I)
TEXT(1) = "He"
TEXT(2) = "ll"
TEXT(3) = "o "
WRITE (6,3) (TEXT(I), I = 1,6)
3 FORMAT (66A2)
END
This old-style source is acceptable to the F90 compiler as it stands. By chance, two characters per integer fits nicely but in many cases having one character per variable is easier for manipulation. So, as usual with Fortran, it's all done with arrays. The DATA statement demonstrates that a quoted string is acceptable as a value for an integer; it is just a matter of bit patterns, and this type miscegnation will work with floating-point variables also though resulting in even stranger numerical values. Looking more closely, note that an INTEGER*4 variable can hold four eight-bit characters but only two-character text literals have been specified. Unlike integer constants, which might be considered to have leading zero digits, text literals are deemed to have trailing spaces as needed: "Wo" is deemed to be "Wo " to make up to the recipient's capacity for four characters, and when format code A2 is specified, the leftmost two characters in the variable are taken. The strange ideas of "little-endianism" have never flourished on mainframes! Thus, if the format code were to be A4, then "Wo " would appear, not " Wo".
The first output (to standard output: unit 6) thus prepends the text "Hello " via the workings of the nominated FORMAT statement without a further mention of variable TEXT, itself not being modified in this action. Thus, this is an example of a single-mention possibility.
Some versions of Fortran offered the ability to write to a variable such as an array rather than to a nominated output unit, via a statement like WRITE (TEXT,1) (TEXT(I),I = 1,3), which array could then itself be written to the actual output via normal statements. This would involve a working variable within the routines for formatted I/O to hold the output, and thus provides one of the reasons that Fortran I/O implementations seldom enable re-entrancy - as with a WRITE statement whose output expression list includes a function evaluation, which function itself attempts to WRITE something, say to a log file, with both WRITE statements employing formatting statements. More modern compilers now require the recipient for this sort of WRITE statement to be of type CHARACTER, so the older style is blocked - and re-entrancy is still a problem.
Still another variant involved writing to unit number zero, which did not actually send anything to an output recipient. Instead, the scratchpad used by the formatted I/O system would retain whatever was produced, which could then be read back via unit number zero. Indeed, reading from unit zero would reveal whatever had been the last line of the previous I/O statement. This would be of interest if a format error had been reported on a READ during some mass data acquisition, so that the error message could show the problematic input that had been obtained rather than just complain. But this facility was not common, and did not become a part of the F90 standard. Perhaps a BACKSPACE and re-read to a text variable will work instead...
Retreating from FORMAT usage to the case of manipulating a "string" variable so as to prepend a given text to the working variable, first the existing content must be moved right to make room (again, an even number of characters is involved) which is achieved via the DO-loop, using certain constants. If on the other hand, text were to be removed from the front, then a loop would be needed to shift the surviving content leftwards. In doing this, one must pay attention to any overlaps and the direction of the loop! By chance, this exercise starts the placement after the end of the existing text but if instead the shift were to be two units, then the first-placed unit would land atop the tail end of the existing text. Thus, for rightwards shifts, one should start with the end of the surviving text and work back to its start.
Having made space, the next statements merely assign some bit patterns to elements of TEXT, and then the result is revealed, again using known constants instead of the associated variables of the more general approach. The result from the two WRITE statements is of course
Hello world! Hello world!
Character facility
With F77 came the CHARACTER type...
CHARACTER*66 TEXT
TEXT = "World!"
TEXT = "Hello "//TEXT
WRITE (6,*) TEXT
END
This means that variable TEXT has space for 66 characters, addressed as TEXT(first:last) starting with one. There is no associated string length facility, so the first assignment places the six characters of the supplied literal, followed by spaces all the way to the end of TEXT. Alternatively, TEXT(1:6) = "World!" would place only six characters, leaving the rest of TEXT to hold whatever it may. This would probably be unsuitable for the next statement, which prepends "Hello " to the content of TEXT (including positions past six) and assigns the result to TEXT, overwriting its previous content - with the aid of a temporary working area. Although in principle there could be cunning schemes that update the recipient "in place" with a minimum of character copying to and fro, this doesn't happen. Only characters up to the capacity of the recipient will be transferred from the expression's result, and if the result is shorter than the capacity of the recipient, trailing spaces will be added. All of this is extra effort! And when TEXT is written out, all 66 characters will be sent forth. It is useful to have a function that locates the last non-blank character!
Modern
With F90, and standardised in F2003, came extensions that enable a variable to be "cut-to-fit" on each usage. The first assignment would discard any storage associated with TEXT and re-assign space matching the size of the expression's result, so TEXT would have six characters. In the next statement, the expression would be evaluated and produce twelve characters (six from "Hello ", and the six of the current size of TEXT), then the current storage for text would be discarded and TEXT re-allocated to be of size twelve. At some cost in overhead. On the other hand, rather than copy the result of an expression from the scratchpad to the recipient, with re-allocation, the recipient variable could be repointed to the result area: no copying needed.
' FB 1.05.0 Win64
Var s = "prepend"
s = "String " + s
Print s
Sleep
- Output:
String prepend
Free Pascal supports everything shown in § Pascal (except the string schema data type, string(20) must be written like here). Furthermore, using the compiler directive {$COperators} the following is possible, too:
var
line: string[20];
begin
line := 'Hello ';
{$COperators on}
line += 'world!';
writeLn(line)
end.
include "NSLog.incl"
void local fn DoIt
CFStringRef s = @"world!"
s = fn StringByAppendingString( @"Hello ", s )
NSLog(@"%@",s)
end fn
fn DoIt
HandleEvents- Output:
Hello world!
Click this link to run this code
Public Sub Main()
Dim sString1 As String = "world!"
Dim sString2 As String = "Hello "
sString1 = sString2 & sString1
Print sString1
End
Output:
Hello world!
s := "world!"
s = "Hello, " + s
Prelude> let f = (++" World!")
Prelude> f "Hello"
- Output:
"Hello world!"
s := "world!"
s := "Hello, " || s
To demonstrate how this could be done with only one reference to the variable during the prepend:
procedure main()
s := ", world"
s[1:1] ||:= "Hello"
write(s)
end
- Output:
prompt$ unicon -s prepend.icn -x Hello, world
Another take on it, using String Scanning:
procedure main()
(s := ", world") ?:= "Hello" || tab(0)
write(s)
end
- Output:
prompt$ unicon -s prepend.icn -x Hello, world
s=: 'value'
s
value
s=: 'new ',s
s
new value
Java does not have a prepend method.
The most logical way to prepend a string value is with basic concatenation.
String string = "def";
string = "abc" + string;
You could also use the String.concat method.
String string = "def";
string = "abc".concat(string);
You could use the StringBuilder class which provides an insert method.
StringBuilder string = new StringBuilder();
string.append("def");
string.insert(0, "abc");
Additionally, you could use the String.format or String.formatted methods.
String string = "def";
string = String.format("abc%s", string);
String string = "def";
string = "abc%s".formatted(string);
All of these will produce the following output.
abcdef
// No built-in prepend
var s=", World"
s = "Hello" + s
print(s);
"world!" as $s
| "Hello " + $ss = "world!"
s = "Hello " * s
s: "world!"
"world!"
"Hello " , s
"Hello world!"
// version 1.0.6
fun main(args: Array<String>) {
var s = "Obama"
s = "Barack " + s
println(s)
// It's also possible to use this standard library function
// though this is not what it's really intended for
var t = "Trump"
t = t.prependIndent("Donald ")
println(t)
}
- Output:
Barack Obama Donald Trump
{def str World}
-> str
Hello, {str}
-> Hello, World
local(x = ', World!')
#x->merge(1,'Hello')
#x // Hello, World!
Using the concatenation operator:
> (set s "world")
"world"
> (++ "hello " s)
"hello world"
Using the concatenation function:
> (set s "world")
"world"
> (string:concat "hello " s)
"hello world"
str = "world!"
put "Hello " before str
put str
-- "Hello world!"The idiomatic way is to use "before"
put "world" into x
put "hello" before x
put x // hello worldBy concatenation:
s = "12345678"
s = "0" .. s
print(s)
By string formatting:
s = "12345678"
s = string.format("%s%s", "0", s)
print(s)
By list joining:
s = "12345678"
s = table.concat({"0", s})
print(s)
- Output:
of each solution
012345678
Module PrependString {
A$="Hello"
A$+=" World"
Print A$
}
PrependString- Output:
Hello World
l := " World";
m := cat("Hello", l);
n := "Hello"||l;
o := `||`("Hello", l);
- Output:
" World"
"Hello World"
"Hello World"
"Hello World"
a = "any text value";
a = "another string literal" <> a (* using concatenation (no built-in prepend) *)
- Output:
"another string literalany text value"
:- module string_prepend.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module string.
main(!IO) :-
S = "World!\n",
io.write_string("Hello " ++ S, !IO).- Output:
Hello World!
Nanoquery has no idiomatic way to prepend one string to another.
s1 = " a test"
s1 = "this is" + s1
println s1- Output:
this is a test
The plus operator, +, concatenates string data. Neko treats strings as mutable fixed length buffers, so some care would need to be taken when prepending variables to variables as there may be buffer sizing to take into consideration. For literals, this is not a concern, as the literals are placed in buffers of the proper size by the compiler.
/**
<doc><p>String prepend in Neko</pre></doc>
**/
var str = ", world"
str = "Hello" + str
$print(str, "\n")
- Output:
prompt$ nekoc string-prepend.neko prompt$ neko string-prepend.n Hello, world
s_ = 'world!'
s_ = 'Hello, 's_
say s_
- Output:
Hello, world!
(setq str "bar")
(push "foo" str)
(println str)
# Direct way.
var str1, str2 = "12345678"
str1 = "0" & str1
echo str1
# Using "insert".
str2.insert("0")
echo str2
- Output:
012345678 012345678
class Prepend {
function : Main(args : String[]) ~ Nil {
s := "world!";
"Hello {$s}"->PrintLine();
}
}Hello World!
let () =
let s = ", world" in
let s = "Hello" ^ s in
print_endline s
" World" "Hello" swap + println- Output:
Hello World
Works with Psion Series 3a and 5. source
PROC main:
LOCAL a$(12)
a$="Code"
a$="Rosetta "+a$
PRINT a$
GET
ENDP- Output:
Rosetta Code
Not supported in GP.
s = "world!";
s = Str("Hello, ", s)- Output:
%1 = "Hello, world!"
See also Free Pascal
program stringPrepend(output);
var
line: string(20);
begin
line := 'Hello ';
line := line + 'world!';
writeLn(line);
line := 'Hello ';
writeStr(line, line, 'world!');
writeLn(line)
end.
- Output:
Hello world! Hello world!
##
var s := '12345678';
s := '0' + s;
Print(s);
- Output:
012345678
use strict;
use warnings;
use feature ':all';
# explicit concatentation
$_ = 'bar';
$_ = 'Foo' . $_;
say;
# lvalue substr
$_ = 'bar';
substr $_, 0, 0, 'Foo';
say;
# interpolation as concatenation
# (NOT safe if concatenate sigils)
$_ = 'bar';
$_ = "Foo$_";
say;
- Output:
Foobar Foobar Foobar
string s = "World"
s = "Hello "&s
NB: s = prepend(s,"Hello ") gives typecheck: s is {"Hello ",'W','o','r','l','d'}, of length 6, rather than the "Hello World" of length 11 you probably wanted.
- and likewise s = prepend("Hello ",s) is not only the wrong way round but dies with typecheck: s is {"World",'H','e','l','l','o',' '} (length 7).
/# Rosetta Code problem: https://rosettacode.org/wiki/String_prepend
by Galileo, 10/2022 #/
"Hello " var s
s "world" chain var s
s printAs usual there are a couple ways of doing this. The most common is probable to use string concatenation (++), but append/3 might be useful if backtracking is needed.
go =>
S = "123456789",
println(S),
S := "A" ++ S,
println(S),
% append
append("B",S,T),
S := T,
println(S),
% insert at position
S := insert(S,1,'C'), % note: must be a char to keep it a proper string
println(S),
% insert many characters
S := insert_all(S,1,"DE"),
println(S),
nl.- Output:
123456789 A123456789 BA123456789 CBA123456789 DECBA123456789
(setq Str1 "12345678!")
(setq Str1 (pack "0" Str1))
(println Str1)- Output:
"012345678!"
Pre_Cat: procedure options (main); /* 2 November 2013 */
declare s character (100) varying;
s = ' bowl';
s = 'dust' || s;
put (s);
end Pre_Cat;dust bowl
\def\prepend#1#2{% #1=string #2=macro containing a string
\def\tempstring{#1}%
\expandafter\expandafter\expandafter
\def\expandafter\expandafter\expandafter
#2\expandafter\expandafter\expandafter
{\expandafter\tempstring#2}%
}
\def\mystring{world!}
\prepend{Hello }\mystring
Result : \mystring
\bye
Here is an equivalent code with eTeX capabilities:
\def\prepend#1#2{% #1=string #2=macro containing a string
\edef#2{\unexpanded{#1}\unexpanded\expandafter{#2}}%
}
\def\mystring{world!}
\prepend{Hello }\mystring
Result : \mystring
\bye
local s = "Code"
s = "Rosetta " .. s
print(s)
- Output:
Rosetta Code
$str = "World!"
$str = "Hello, " + $str
$str
Hello, World!
In its admirable wisdom, Prolog is generally unfriendly to state mutations and destructive assignment. However, it is also very flexible. Using the traditional representation of strings as lists of character codes, and the non-logical predicate `setarg/3`, we can destructively set the head and tail of the list to achieve a mutation of the variable holding the string. I define an operator for the purpose:
:- op(200, xfx, user:(=+)).
%% +Prepend =+ +Chars
%
% Will destructively update Chars
% So that Chars = Prepend prefixed to Chars.
% eazar001 in ##prolog helped refine this approach.
[X|Xs] =+ Chars :-
append(Xs, Chars, Rest),
nb_setarg(2, Chars, Rest),
nb_setarg(1, Chars, X).
Example of this abomination in action:
?- Str = `World!`, `Hello, ` =+ Str.
Str = "Hello, World!".
Note: I can't imagine when I would want to do this in Prolog.
S$ = " World!"
S$ = "Hello" + S$
If OpenConsole()
PrintN(S$)
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf
- Output:
Hello World!
File: string_prepend.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
s = "12345678"
s = "0" + s # by concatenation
print(s)
- Output:
012345678
s$ = "prepend"
s$ = "String " + s$
Print s$
- Output:
String prepend
$ "with a rubber duck."
$ "One is never alone "
swap join
echo$- Output:
One is never alone with a rubber duck.
;there is no built-in way to set! prepend in racket
(define str "foo")
(set! str (string-append "bar " str))
(displayln str)
;but you can create a quick macro to solve that problem
(define-syntax-rule (set-prepend! str value)
(set! str (string-append value str)))
(define macrostr " bar")
(set-prepend! macrostr "foo")
(displayln macrostr)
- Output:
bar foo foo bar
(formerly Perl 6)
# explicit concatentation
$_ = 'byte';
$_ = 'kilo' ~ $_;
.say;
# interpolation as concatenation
$_ = 'buck';
$_ = "mega$_";
.say;
# lvalue substr
$_ = 'bit';
substr-rw($_,0,0) = 'nano';
.say;
# regex substitution
$_ = 'fortnight';
s[^] = 'micro';
.say;
# reversed append assignment
$_ = 'cooper';
$_ [R~]= 'mini';
.say;
- Output:
kilobyte megabuck nanobit microfortnight minicooper
Red []
s: "world"
insert s "hello "
print s
- Output:
hello world
zz= 'llo world!' /*─────────────── using literal abuttal.────────────*/
zz= 'he'zz /*This won't work if the variable name is X or B */
say zz
gg = "llo world!" /*─────────────── using literal concatenation.──────*/
gg = 'he' || gg
say gg
aString= 'llo world!' /*─────────────── using variable concatenation.─────*/
bString= "he"
aString= bString || aString
say aString
output
hello world! hello world! hello world!
aString = "World!"
bString = "Hello, " + aString
see bString + nlfor Raspberry pi pico 2 see instructions to page risc v
# riscv assembly raspberry pico2 rp2350
# program preendstring.s
# connexion putty com3
/*********************************************/
/* CONSTANTES */
/********************************************/
/* for this file see risc-v task include a file */
.include "../../constantesRiscv.inc"
.equ BUFFERSIZE, 100
/*******************************************/
/* INITIALED DATAS */
/*******************************************/
.data
szMessStart: .asciz "Program riscv start.\r\n"
szMessEndOk: .asciz "Program riscv end OK.\r\n"
szCariageReturn: .asciz "\r\n"
szMessErrorString: .asciz "Error buffer size."
szString: .asciz "British Museum."
szStringPreend: .asciz "The rosetta stone is at "
.align 2
/*******************************************/
/* UNINITIALED DATA */
/*******************************************/
.bss
sBuffer: .skip BUFFERSIZE
.align 2
/**********************************************/
/* SECTION CODE */
/**********************************************/
.text
.global main
main:
call stdio_init_all # général init
1: # start loop connexion
li a0,0 # raz argument register
call tud_cdc_n_connected # waiting for USB connection
beqz a0,1b # return code = zero ?
la a0,szMessStart # message address
call writeString # display message
la a0,szString
call writeString # display message
la a0,szCariageReturn
call writeString
la a0,szString # address string 1
la a1,szStringPreend # address string 2
la a2,sBuffer # result buffer
li a3,BUFFERSIZE
call preendString #
la a0,sBuffer # result buffer
call writeString # display message
la a0,szCariageReturn
call writeString
la a0,szMessEndOk # message address
call writeString # display message
call getchar
100: # final loop
j 100b
/***************************************************/
/* search string at beguining */
/***************************************************/
# a0 contains string
# a1 contains search string
# a0 returns 1 if find or 0 if not or -1 if error
preendString:
addi sp, sp, -4 # reserve stack
sw ra, 0(sp) # save registers @ save registers
li t1,0 # init counter
li t2,0
1: # copy string2 to result
add t0,a1,t1 # compute byte address
lbu t3,(t0) # load byte string
beqz t3,2f # zero final
add t0,a2,t1 # compute byte address result
sb t3,(t0) # store byte
addi t1,t1,1
bge t1,a3,99f
j 1b
2: # copy string 1 to result
add t0,a0,t2 # compute byte address
lbu t3,(t0) # load byte string
add t0,a2,t1 # compute byte address result
sb t3,(t0) # store byte
beqz t3,3f # zero final
addi t2,t2,1
addi t1,t1,1
bge t1,a3,99f
j 2b
3:
mv a0,t1 # return total length
j 100f
99: # error
la a0,szMessErrorString
call writeString # display message
li a0,-1 # error
100:
lw ra, 0(sp)
addi sp, sp, 4
ret
/************************************/
/* file include Fonctions */
/***********************************/
/* for this file see risc-v task include a file */
.include "../../includeFunctions.s"Program riscv start. British Museum. The rosetta stone is at British Museum. Program riscv end OK.
In HP-48+ RPL versions, the STO+ instruction can either append or prepend a string to a variable containing already a string.
"def" 'Z' STO "abc" 'Z' STO+ Z
Output
1: "abcdef"
There is a method for prepending a string, aptly named "prepend".
str = "llo world"
str.prepend("He")
p str #=> "Hello world"
let mut s = "World".to_string();
s.insert_str(0, "Hello ");
println!("{}", s);
Evaluation in Scala worksheet
val s = "World" // Immutables are recommended //> s : String = World
val f2 = () => ", " //Function assigned to variable
//> f2 : () => String = <function0>
val s1 = "Hello" + f2() + s //> s1 : String = Hello, World
println(s1); //> Hello, World
There are no variables in sed, just two distinct locations for storing a string: The "pattern space" and the "hold space". To prepend a string literal to the pattern space, the s command can be used:
s/^/String Literal/
To prepend a string literal to the hold space, it needs to be exchanged with the pattern space, before and after the operation:
x
s/^/String Literal/
x
$ include "seed7_05.s7i";
const proc: main is func
local
var string: s is "world!";
begin
s := "Hello " & s;
writeln(s);
end func;- Output:
Hello world!
var str = 'llo!';
str.sub!(/^/, 'He');
say str;
or
var str = 'llo!';
str.prepend!('He');
say str;- Output:
Hello!
s = ', World!'
OUTPUT = s = 'Hello' s
END- Output:
Hello, World!
As a structured script.
#!/usr/local/bin/spar
pragma annotate( summary, "string_prepend" )
@( description, "Create a string variable equal to any text value." )
@( description, "" )
@( description, "Prepend the string variable with another string " )
@( description, "literal." )
@( category, "tutorials" )
@( author, "Ken O. Burtch" )
@( see_also, "http://rosettacode.org/wiki/String_prepend" );
pragma license( unrestricted );
pragma software_model( nonstandard );
pragma restriction( no_external_commands );
procedure string_prepend is
world : constant string := "World!";
hello : constant string := "Hello ";
s : string;
begin
-- Using concatenation
s := world;
s := hello & @;
? s;
-- Using strings library
s := world;
s := strings.insert( @, 1, hello );
? s;
command_line.set_exit_status( 0 );
end string_prepend;- Output:
$ spar string_prepend.sp Hello World! Hello World!
> val s="any text" ;
val s = "any text": string
> "prepended " ^ s;
val it = "prepended any text": stringsca s="Vita Brevis"
sca s="Ars Longa "+s
di s
Ars Longa Vita Brevisvar str = ", World"
str = "Hello" + str
print(str)- Output:
Hello, World!
var str = ", World"
str = "Hello \(str)"
println(str)- Output:
Hello, World!
Concatenation is a fundamental feature of Tcl's basic language syntax.
set s "llo world"
set s "he$s"
puts $s- Output:
hello world
decl string s
# set s to "world"
set s "world"
# prepend "hello "
set s (+ "hello " s)
# outputs "hello world"
out s endl consoleFunction StringPrepend()
Dim s As String
s = "bar"
s = "foo" & s
Debug.Print s
End Functions = "bar"
s = "foo" & s
WScript.Echo s- Output:
foobar
mut s := "world!"
s = "Hello, " + s
println(s)- Output:
Hello, world!
s <- "12345678"
s <- ("0" + s)var s = "world!"
s = "Hello, " + s
System.print(s)- Output:
Hello, world!
Dim s As String = "bar"
s = "foo" + s
MsgBox(s)- Output:
foobar
include xpllib;
char S, T(80);
[S:= "world!";
S:= StrCat(StrCopy(T,"Hello, "), S);
Text(0, S);
]- Output:
Hello, world!
s:="bar"; s="foo" + s; s.println();
s:="bar"; s=String("foo",s); s.println();
s:="bar"; s="%s%s".fmt("foo",s); s.println();
// a Data is a byte buffer/editor:
s:=Data(Void,"bar").insert(0,"foo").text; s.println();- Output:
foobar foobar foobar foobar