使用参数

时间:2017-05-06 13:11:11

标签: c++ linux bison xdotool

马上,没有这不是重复。我一直在寻找几个小时来做​​这件事,但是几周前我开始编码可能很简单。

如何在参数内连接一个字符串?

我希望能够做到这一点,但它不起作用:

system("xdotool mousemove " << $2 << " " << $3);

是的,这是C ++,只是我在Bison中使用它,所以 $ 2和$ 3是变量(浮点数)。就像在Bison文件中一样,我有很多事情要做,我希望在一行中有一个解决方案,比如我在这里的格式

修改

这里的问题实际上是连接。我这样做了,但它仍然无法正常工作,并给了我同样的错误:

string temp = "xdotool mousemove " << $3 << " " << $4; system(temp.c_str());

编辑2

很抱歉这么多编辑,但我尝试了

system(("xdotool mousemove " + to_string($3) + " " + to_string($4)).c_str());

但它仍然无效:(还有其他想法吗?这次错误说‘to_string’ was not declared in this scope

亲切的问候,
马修萨内拉

1 个答案:

答案 0 :(得分:2)

<<不是字符串连接运算符。您正在考虑的用法是:

std::cout << "The value is " << x << '\n';

仔细检查上述行将表明它根本不涉及使用std::string; <<运算符的左侧参数始终为std::ostream&。 (第一个是明确指定的,另外两个是前一个<<运算符的结果,在这种情况下返回std::ostream&&。)

您从编译器获得的错误消息是完全正确的,您应该花时间了解它告诉您的内容,至少如果您的目标是学习如何编写C ++程序。

C ++标准库重载+运算符以进行std::string个对象的连接。但像"xdotool"这样的字符串文字不是std::string;它是char的数组。您还可以使用+std::string与C样式字符串(即NUL终止的字符数组)连接起来,但如果参数必须至少有一个std::string

并且没有从数字到字符串的自动转换,也没有+的重载需要std::string和数字。如果您使用的是C++11或更新版本,则可以使用std::to_string进行显式转换。

在尝试使用<<运算符时,通常使用类似于输出流的对象,它只是创建一个内存中的字符串缓冲区:std::ostringstream。 Thar对象实现str方法以将缓冲区提取为std::string;请参阅示例here,了解与您想要的内容类似的内容。

但是,正如我所提到的,std::string不是char的简单数组,因此您无法将其传递给期望C样式字符串的函数。这包括标准C库中的所有函数,如system,它们对C ++ std::string一无所知。因此,您需要使用c_str对象的std::string成员函数将其数据提取为C样式字符串。