JaZZyCooL
JaZZyCooL

Reputation: 1

Shifting a string in matlab

Ok so I have retrieved this string from the text file now I am supposed to shift it by a specified amount. so for example, if the string I retrieved was

To be, or not to be
That is the question

and the shift number was 5 then the output should be

stionTo be, or not
to beThat is the que

I was going to use circshift but the given string wouldn't of a matching dimesions. Also the string i would retrieve would be from .txt file.

So here is the code i used

S = sprintf('To be, or not to be\nThat is the question')

circshift(S,5,2)

but the output is

stionTo be, or not to be
That is the que

but i need

stionTo be, or not
to beThat is the que

Upvotes: 0

Views: 1778

Answers (2)

beaker
beaker

Reputation: 16811

You can do this by performing a circular shift on the indices of the non-newline characters. (The code below actually skips all control characters with ASCII code < 32.)

function T = strshift(S, k)
   T = S;
   c = find(S >= ' '); % shift only printable characters (ascii code >= 32)
   T(c) = T(circshift(c, k, 2));
end

Sample run:

>> S = sprintf('To be, or not to be\nThat is the question')

S = To be, or not to be
That is the question

>> r = strshift(S, 5)

r = stionTo be, or not
to beThat is the que

If you want to skip only the newline characters, just change to

c = find(S != 10);

Upvotes: 1

Poelie
Poelie

Reputation: 713

By storing the locations of the new lines, removing the new lines and adding them back in later we can achieve this. This code does rely on the insertAfter function which is only available in MATLAB 2016b and later.

S = sprintf('To be, or not to be\nThat is the \n question');
newline = regexp(S,'\n');
S(newline) = '';
S = circshift(S,5,2);
for ii = 1:numel(newline)
    S = insertAfter(S,newline(ii)-numel(newline)+ii,'\n');
end
S = sprintf(S);

Upvotes: 1

Related Questions