c++ - 从 C 程序执行终端命令,不符合我的预期

标签 c++ linux debian raspberry-pi

我正在尝试获取包含 WiFi 信号强度的变量。从终端执行以下命令成功返回

iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1

返回率为 74/100

但是,当我将其放入 system() 调用中时,出现以下编译错误。

int main (){
system("iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1");
return 0;
}

当我编译那个...

$ c++ wifi.cc wifi.cc:在函数“int main()”中:

wifi.cc:8:59: 错误:分配只读位置‘"iwconfig $_[0]|grep Signal|cut -d"’

wifi.cc:8:59: 错误:将“const char [16]”赋值给“const char [34]”时类型不兼容

非常感谢任何想法/建议。

最佳答案

这是因为您的字符串文字中包含未转义的引号。你需要逃避他们:

system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");

在您的错误代码中,引号是这样配对的:

system("iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1");
       ^                                   ^ ^            ^ ^    ^
       └─────────────────1─────────────────┘ └──────2─────┘ └─3──┘

如您所见,共有三个独立的字符串文字。转义引号后,就 C++ 而言,只有一对引号:

system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");
       ^                                                             ^
       └──────────────────────────────1──────────────────────────────┘

转义引号(前面带有 \ 的引号)只是字符串的一部分。

但是,在终端中,命令不是某个字符串的一部分。它本身只是一个命令,引号是这样配对的:

iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1
                                   ^ ^            ^ ^
                                   └1┘            └2┘

关于c++ - 从 C 程序执行终端命令,不符合我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16004913/

相关文章:

c++ - 在 Windows 中检索全局钩子(Hook)链

c++ - 有没有办法在 Linux 中扫描构​​建的 ARM 库中的函数?

linux - centOS 7 上的 Docker-CE 无法运行容器

从 go 调用 C 函数

我网站上的 PHP 页面显示为空白

html - 不能通过 Mac OS X "open"命令使用 mailto 包含主题和正文

c++ - 在 IDL 文件上使用 opendds_idl 工具时出现 fatal error C1083

java - 如何以编程方式确定在 Java 中运行 x11 窗口的进程

linux - 为什么 "at"命令总是警告我命令将通过 sh 执行?

linux - 在 bash 中断开与 wifi 网络的连接