Octave中如何正确将字符串作为if判断的条件?
Octave 代码问题解答
1. 为什么判断条件里的yes、no需要加引号
Octave语法规则中,未被引号包裹的连续字符会被识别为变量标识符,而非字符串常量。如果直接写if I == yes,程序会尝试读取名为yes的变量值,若你没有提前定义该变量,会直接抛出未定义变量的报错。只有用引号包裹后,"yes"/"no"才会被解析为字符串类型的固定值,可用于和用户输入的字符串做匹配校验。
2. 输入no后依旧触发手动输入逻辑的原因
你的代码存在两处核心语法错误,导致分支判断完全失效:
- 第一,混淆了赋值运算符和相等判断运算符:Octave中
=是赋值运算符,==才是相等判断运算符。你写的if I = "yes"实际会直接给变量I赋值为"yes",赋值操作默认返回真值,所以第一个if分支永远会被触发,和你之前的输入内容无关。 - 第二,
input()函数默认会将用户输入作为表达式求值,若要直接获取用户输入的原始字符串,需要添加第二个参数s,否则输入内容的类型匹配会出现异常。
修正后的可运行代码
function trial() % 加's'参数直接获取原始字符串输入,用户无需手动加引号 I = input("f INPUT > Manually input frequency value? (yes/no):", "s"); % 用strcmp做字符串比较,避免不同长度字符串用==判断时报错 if strcmp(I, "yes") f = input("Please input the frequency value : \n"); elseif strcmp(I, "no") f = randi([100 1000],5,5); else error("Input invalid, please only enter yes or no"); endif O = 2 * pi * f; disp("Calculated angular frequency result:"); disp(O); plot(f, O, "o"); xlabel("Frequency"); ylabel("Angular Frequency"); end
补充说明
使用strcmp()做字符串比较比==更稳妥:如果两个对比的字符串长度不一致,用==判断会直接抛出维度不匹配的错误,strcmp()会直接返回逻辑假,适配用户输入错误的场景。修正后运行程序,直接输入yes或no即可,不需要额外给输入内容加引号。
内容的提问来源于stack exchange,提问作者Radithya Rafee
相关产品推荐
相关产品推荐

