【问题标题】:Why does my MATLAB code duplicate all symbols except spaces, which it removes?为什么我的 MATLAB 代码会重复除空格之外的所有符号,但会删除这些符号?
【发布时间】:2020-11-14 03:04:11
【问题描述】:

我的目标是获取一个加密字符串并复制所有符号。因为唯一的输入是小写,所以我忽略了考虑大写字符。

我设计我的代码来预测包含重复符号的最终结果的总长度,这就是为什么我将punct(一个包含字符串中符号总数的变量)添加到字符串的长度。迭代时,如果代码遇到一个符号,它应该将加密字符串的后续部分保存为sub,并在下一个索引中复制它遇到的符号。最后,从索引 1 到重复符号的加密字符串与保存的子字符串连接起来,我已经测试过它可以在类型和数字之间的所有符号情况下工作。我的一个问题是这不适用于空格,它会删除而不是复制空格。我逐步浏览了代码,并认为这可能是由于strcat 函数。这让我感到困惑,因为应该像对待任何其他 ASCII 字符一样对待空格。当我收到错误时,它说这是由于数组超出范围。

我使用的测试用例是encrypted = hlnv.ylwb.lmxv.glow.nvhlnv ylwb lmxv glow nvpunct 都是 4,因为每个都有 4 个非字母字符。

criticallength = length(encrypted) + punct;
ii = 1;
while ii <= criticallength
    if encrypted(ii) < 97 || encrypted(ii) > 122
        sub = encrypted(ii + 1:end);
        encrypted(ii + 1) = encrypted(ii);
        encrypted = strcat(encrypted(1:ii + 1), sub);
        ii = ii + 1;
    end
    ii = ii + 1;
end

【问题讨论】:

  • 请包含encryptedpunct 的定义,以便我们可以运行您的代码并查看它是否正常工作。特别是,MATLAB 中的字符串和字符数组之间存在差异,这在这里非常相关。
  • “我使用的测试用例是encrypted = hlnv.ylwb.lmxv.glow.nv”这忽略了我所询问的关键信息。请注意这不是有效的 MATLAB 语法。它是e='str'e="str",这两种情况会导致 MATLAB 中的行为截然不同。请具体点,贴一个独立完整的代码块,我们可以复制粘贴。这是避免不精确的最好方法。见minimal reproducible example

标签: arrays string matlab


【解决方案1】:

是的,strcat 根据documentation 删除尾随空格:

对于字符数组输入,strcat 删除尾随的 ASCII 空格 字符:空格、制表符、垂直制表符、换行符、回车符和 换页。对于元胞和字符串数组输入,strcat 不会删除 尾随空格。

这意味着strcat('A ', 'B') 结果'AB',而strcat('A', ' B') 结果'A B'。但在你的情况下,你不需要打电话给strcat。相反,您可以简单地使用数组连接,例如返回所需输出的['A ' 'B']'A B'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 2019-08-25
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多