String MatLab:需要添加一个'\t';(制表符字符)字符串中每4个字符
再次感谢你们昨天的帮助,我很感激。但是我的MatLab编程仍然存在一些问题 背景 我需要解析一个很长的字符串(200k+字符)。都是十六进制的,我需要用MatLab来绘制。我正试图打破这些台阶。我需要在此字符串中每隔4个字符放置一个“\t”(制表符) 不过,让我们忘了我现在真正需要做什么。让我们把重点放在更一般的事情上。假设我的字符串是:String MatLab:需要添加一个'\t';(制表符字符)字符串中每4个字符,string,matlab,String,Matlab,再次感谢你们昨天的帮助,我很感激。但是我的MatLab编程仍然存在一些问题 背景 我需要解析一个很长的字符串(200k+字符)。都是十六进制的,我需要用MatLab来绘制。我正试图打破这些台阶。我需要在此字符串中每隔4个字符放置一个“\t”(制表符) 不过,让我们忘了我现在真正需要做什么。让我们把重点放在更一般的事情上。假设我的字符串是: abcdefghijklmnopqrstuvwxyz 我想让MatLab输出: abcd efgh ijkl mnop qrst uvwx yz 我可怜的
abcdefghijklmnopqrstuvwxyz
我想让MatLab输出:
abcd efgh ijkl mnop qrst uvwx yz
我可怜的尝试
for k = 4:length(Vader)
Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
k= k+5;
end
Vader
这将产生:
abcd efghijklmnopqrstuvwxyz
abcd和efghijk之间有26''(空格字符)等。
但当我尝试这一点时:
k= 4;
Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
k= k+5;
Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
k= k+5;
Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
k= k+5;
.....etc
输出为:
abcd efgh ijkl mnop qrst uvwx yz
完全正确
发生了什么事?
为什么for循环不同于仅仅写出我的所有步骤?对我来说,它们似乎是一样的。我迷路了。此外,我需要对任何字符串、任何要输入的字符(\t、\n、'somechars'等)和任何长度的字符串执行此操作。我的最终目标是让它以6个字符为一组处理4个字符的十六进制字符串,末尾有2个停止/启动字符(总共28个字符)
谢谢你的帮助,我很感激
编辑
我是个笨蛋:
for k = 4:5:(length(Vader))
Vader = horzcat(Vader(1:k), char(13), Vader(k+1:end));
k = k+1;
end
Vader
我需要这一步的份量
k = 4:5:(length(Vader))
vs我的旧代码
k = 4:(length(Vader))
但是这不会在整个过程中循环。正如下面的一位评论者所指出的,长度(Vader)部分是在开始时初始化的。然后,代码将在达到所需输出之前停止,并且字符串现在比最初更长
有没有关于如何强制长度(维德)部分随每个循环更新的想法?多谢各位
编辑2:
好的,明白了!您必须预先计算最终字符串的长度,并将其作为“for”循环的限制:
jarJar = 4; %how many in string you want to skip over
luke = ceil(length(Vader)*((1+jarJar)/jarJar));
for hanSolo = jarJar:(1+jarJar):luke
Vader = horzcat(Vader(1:hanSolo), ' ', Vader(hanSolo+1:end));
hanSolo = hanSolo+1;
end
Vader
ceil()部分很重要。您可以得到分数值,并且希望超过最终字符串长度的末尾,而不是在它下面(如floor()所示)
谢谢你的帮助,鲍勃·吉尔曼和脑力采摘。有一只橡皮鸭有时可以跟你顶嘴,这真的很有帮助。你可以使用将字符串转换成4列矩阵,然后将一列制表符连接到它;然后把它转换回来
下面是一个示例,给定您的起始字符串:
>> str = 'abcdefghijklmnopqrstuvwxyz';
请注意,length(str)
是26,不能被4分割。为了解决这个问题,让我们看看距离下一个可被4整除的数字有多远。然后我们将向字符串中添加那么多空格。这是必要的,因为重塑
使您在操作前后获得相同数量的元素;它不会仅仅为了使大小正确而添加更多元素
>> numSpaces = 4 - mod(length(str), 4)
numSpaces =
2
>> str = [str repmat(' ', [1 numSpaces])];
现在,让我们重塑。“重塑”按列操作,因此我们需要转置输出
>> reshapedStr = reshape(str, 4, []).'
reshapedStr =
abcd
efgh
ijkl
mnop
qrst
uvwx
yz
然后,分别创建一个新的列向量tabs
,其长度与重塑str
相同:
>> tabs(1:length(reshapedStr), 1) = sprintf('\t');
将此列连接到我们的数组:
>> reshapedStr = [reshapedStr tabs];
并将其重新整形(请注意,我们转置reformedstr
,因为它是按列操作的,而不是按行操作的)
如果需要,也可以删除最后的空格和制表符尾部yz
jarJar = 4; %how many in string you want to skip over
luke = ceil(length(Vader)*((1+jarJar)/jarJar));
for hanSolo = jarJar:(1+jarJar):luke
Vader = horzcat(Vader(1:hanSolo), ' ', Vader(hanSolo+1:end));
hanSolo = hanSolo+1;
end
Vader
这是一种很好的方法,请参阅上面的编辑以获得更详细的解释。谢谢。我的第一反应是说你想用表示k=1:4:length(Vader)
(注意,我使用的是begin:stepsize:end
范围语法,而不是你使用的begin:end
语法),但即使这样也不对。请记住,for循环条件中的length(Vader)
将在循环开始执行之前计算一次。但是当循环结束时,Vader
将更长,因此您并不是真正循环到Vader
的末尾。感谢Bob Gilmore的“开始:步长:结束”条件。我还遇到了for循环在开始时评估大小的问题,而不是整个循环。我将尝试一个嵌套了“for”循环的“while”循环,看看它能给我带来什么。我希望我记得把答案贴回这里Bob Gilamn,请参阅我上面的编辑以获得解决方案。您必须首先计算最终字符串的长度,然后将其用作for的限制loop@user3320919您应该将找到的解决方案作为问题的答案发布,然后接受它,以便阅读问题的人立即意识到您的问题已得到解决。好的,可以!谢谢这是一个很好的起点,更接近我实际需要做的事情。非常感谢。但是,对于奇数长度的字符串,需要numSpaces=4-mod(长度(str),4)
。我假设传入字符串的长度为奇数或偶数。不过,非常感谢你们,这实际上是我正在努力的下一步,但失败了,你们已经在我不问的情况下为我回答了。当啷,你就是那个男人!
jarJar = 4; %how many in string you want to skip over
luke = ceil(length(Vader)*((1+jarJar)/jarJar));
for hanSolo = jarJar:(1+jarJar):luke
Vader = horzcat(Vader(1:hanSolo), ' ', Vader(hanSolo+1:end));
hanSolo = hanSolo+1;
end
Vader