2017-06-16 58 views
0

好吧,我已經從文本文件中檢索到了這個字符串,現在我應該將它移動一個指定的數量。因此,例如,如果我檢索到的字符串是在matlab中移動一個字符串

生存還是毀滅
這是一個問題

和移位數爲5,則輸出應該是

stionTo是或不是
到beThat是闕

我打算使用circshift,但給定的字符串不會有匹配的維數。此外,我會檢索的字符串將來自.txt文件。

因此,這裏是我用

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

circshift(S,5,2) 

的代碼,但輸出是

stionTo是,或不被
這是闕

,但我需要

stionTo是,或不是
到beThat是闕

+1

這個字符串是如何存儲的?它是一個String對象嗎?它是一個帶有換行符的char數組嗎?它是char數組的單元數組嗎?你有什麼嘗試?你能告訴我們你的代碼嗎? – beaker

+0

你到底做了什麼? 'circshift(S,5,2)'對我來說工作得很好,其中'S = sprintf('是或不是\ n那就是問題')' –

+0

不會每次都會有不同的字符串,所以我不會知道circshift是否每次都提供該輸出。 – JaZZyCooL

回答

1

通過存儲新線的位置,除去新生產線,並在以後,我們可以做到這一點增加他們回來。此代碼確實依賴於僅在MATLAB 2016b及更高版本中可用的insertAfter函數。

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); 
1

您可以通過對非換行符的索引執行循環移位來完成此操作。 (實際上下面的代碼跳過與ASCII碼的所有控制字符< 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 

採樣運行:

>> 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 

如果你想跳過的換行符,只是改變

c = find(S != 10); 
相關問題