1

我正在尝试获取一个包含 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"'</p>

wifi.cc:8:59:错误:将“const char [16]”分配给“const char [34]”时的类型不兼容</p>

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

4

4 回答 4

5

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

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┘
于 2013-04-14T22:08:33.103 回答
1

你需要逃避"这样的事情\"

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

否则,您在第一种情况下拥有的是:

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

它试图分配给一个字符串文字,这是错误assignment of read-only location的来源。

于 2013-04-14T22:08:28.997 回答
1

如果你的字符串足够简单并且你想避免逃生地狱,你也可以在 shell 命令中使用单引号,例如:

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

这只有效,因为在 shell 中,您可以对字符串文字同时使用双引号和单引号(两者之间存在差异,但现在让我们不要理会它们)。

除此之外,我建议使用库调用而不是执行终端程序。这应该使您的程序更快(因为您不必调用调用库的外部程序来获取一些值并打印它;只为您解析打印输出并尝试读取正确的值),并且更健壮(例如,如果iwconfig由于新版本或仅仅因为它在不同的语言下运行而改变输出;或者您有多个无线连接,或者...)

看看libiw

于 2013-04-15T07:32:43.830 回答
0

您需要使用转义序列在字符串中添加引号,如下所示:

system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");
//                                         ^^ ^^            ^^ ^^
于 2013-04-14T22:08:49.967 回答