我正在尝试获取包含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信号| cut -d”'
wifi.cc:8:59:错误:'const char [16]'赋值给'const char [34]'的不兼容类型
非常感谢任何想法/建议。
答案 0 :(得分: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┘
答案 1 :(得分: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
的来源。
答案 2 :(得分:1)
如果你的字符串很简单并且你想避免逃避 - 地狱,你也可以在shell命令中使用单引号,例如:
system("iwconfig wlan0 |grep Signal| cut -d'=' -f3 |cut -d' ' -f1");
这只能起作用,因为在shell中你可以使用双引号和单引号作为字符串文字( 两者之间有差异,但现在让我们不要理会它们。)
除了我建议使用库调用而不是执行终端程序。这应该使您的程序更快(因为您不必调用外部程序调用库来获取某些值并打印出来;仅用于解析打印输出并尝试读取正确的值),并且更加健壮(例如,如果iwconfig
的输出因新版本而改变,或仅仅因为它是在不同的语言下运行;或者您有多个无线连接,或者......)
查看libiw
答案 3 :(得分:0)
您需要使用转义序列在字符串内添加引号,如下所示:
system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");
// ^^ ^^ ^^ ^^