【发布时间】:2015-10-14 11:26:12
【问题描述】:
考虑以下代码
x = input('Input an array: ');
如果用户键入[1 2 3],变量x 将被分配该数字向量。同样,如果他们键入{1, [2 3], 'abc'},变量x 将是一个包含这些值的元胞数组。很好。
现在,如果用户键入[sqrt(2) sin(pi/3)],变量x 将被分配结果值:[1.414213562373095 0.866025403784439]。这是因为所提供的数据由input评估:
input提示用户输入。result = input(prompt)在屏幕上显示prompt字符串,等待 对于来自键盘的输入,评估输入中的任何表达式, 并返回result中的值。 [...]
这可能会导致问题。例如,如果用户键入addpath('c:\path\to\folder') 作为输入会发生什么?由于输入被评估,它实际上是一个
Matlab 将执行的命令。因此,用户可以将文件夹添加到路径中。更糟糕的是,如果他们输入path(''),路径实际上将变为空,Matlab 将停止正常工作。
另一个潜在的问题来源是
[...] 要评估表达式,
input访问当前工作区中的变量。
例如,如果用户输入fprintf(1,'%f', varname) 和varname 是一个现有的数值数组,用户将知道它的当前值。
这种行为可能是设计使然。 Matlab 程序的用户在输入数据时是受信任的,就像他们受信任不会按 Control-C 来停止程序(然后发出所有命令或检查所有变量)他们喜欢!)。
但在某些情况下,程序员可能想要一个更“安全”的input 函数,我的意思是
- 在评估用户时阻止任何函数调用 输入;和
- 防止输入访问程序的变量。
所以[1 2] 将是有效输入,但[sqrt(2) sin(pi/3)] 或path('') 不会因为第1 项;而[1 2 3 varname(1)] 也会因为第 2 项而无效。
【问题讨论】:
-
感谢分享!如果只是关于读取数字数组,您可以再次将输入读取为字符串,并在字符串上使用
str2num。或者这种方法还有其他缺点吗? -
@hbaderts 对于这种特殊情况(数字数组),我认为这将是一个非常好的方法:简单而有效。不过,它不适用于更一般的输入(单元格数组、字符数组等)
-
是否有任何操作,例如*,+,-,/ 等有效吗?或者您只想要数字、文本或数字和字符的组合(存储在单元格中)?所有文本都应该包含在
'中吗? -
我想你对小鲍比桌很熟悉吧?未能进行输入验证始终是 BadThing(TM) 。我无法想象为什么(好吧,我可以)MathWorks 允许这样的东西投入生产。
-
@LuisMendo:抱歉,没看到那部分。我对 Carl 的短视评论做出了反应:“我无法想象为什么(好吧,是的,我可以)MathWorks 允许这样的东西投入生产。”
标签: matlab input user-input