Mac环境下C++调用system()函数打开应用报错问题求助
问题修复方案
你现有代码存在3处核心错误,逐一修正后即可正常运行:
- 逻辑判断语法错误
你写的if (App == "Chrome" || "Google Chrome" || "google")不符合C++语法规则,||两侧需要是独立的布尔判断表达式,现有写法后面两个字符串字面量会被隐式转换为布尔值(非空指针永远为真),所以这个if条件永远成立,完全起不到判断作用。正确写法是if (App == "Chrome" || App == "Google Chrome" || App == "google")
- 逻辑判断语法错误
- 输入读取逻辑错误
cin >> App默认以空格、换行、制表符作为分隔符,如果你输入的是带空格的Google Chrome,只会把第一个空格前的Google存入App变量,剩下的内容会留在输入缓冲区,完全无法匹配你预期的输入值。如果要读取整行包含空格的输入,需要用getline(cin, App)。
- 输入读取逻辑错误
- system调用参数存在两个错误
一是路径缺少macOS应用必须的.app后缀,二是路径包含空格没有做转义处理:shell执行命令时会把空格作为参数分隔符,你写的system("open /Applications/Google Chrome")会被shell识别为两个参数/Applications/Google和Chrome,自然找不到对应文件。需要给带空格的路径加引号或者空格前加转义反斜杠,在C++字符串中,引号和反斜杠都需要额外转义:
方式1:加转义引号:system("open \"/Applications/Google Chrome.app\"");
方式2:加转义反斜杠:system("open /Applications/Google\\ Chrome.app");
- system调用参数存在两个错误
完整修正代码
#include <iostream> #include <string> using namespace std; int main() { string App; cout << "What Application Would You Like To Use: "; // 读取整行输入,支持带空格的应用名 getline(cin, App); // 修正逻辑判断写法 if (App == "Chrome" || App == "Google Chrome" || App == "google") { // 补全后缀+转义路径空格,调用正常 system("open \"/Applications/Google Chrome.app\""); } return 0; }
内容的提问来源于stack exchange,提问作者MrCackalacky
相关产品推荐
相关产品推荐

