Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的字符转义_C_Escaping - Fatal编程技术网

C语言中的字符转义

C语言中的字符转义,c,escaping,C,Escaping,我需要把一些命令传递给C程序,然后得到它的输入。 作为它的一部分,我有一行Expect脚本必须放在哪里 FILE *command = popen("script here","r"); 我需要执行的脚本是: expect -c 'spawn ssh user@host cat /proc/stat expect { -re ".*yes/no.*" { send "yes\r" exp_continue } "password:" { send -- "password\r" } } i

我需要把一些命令传递给C程序,然后得到它的输入。 作为它的一部分,我有一行Expect脚本必须放在哪里

FILE *command = popen("script here","r");
我需要执行的脚本是:

expect -c 'spawn ssh  user@host cat /proc/stat

expect {
-re ".*yes/no.*" {
send "yes\r"
exp_continue
}
"password:" {
send -- "password\r"
}
}
interact'
所以,我需要对几个角色进行转义,这样脚本才能正常工作。 我尝试了不同的逃跑顺序,但都不对

谢谢你的关注

UPD:


如果不转义,编译时会出现错误(“在程序中出现“*”之前的语法错误”、“在程序中出现”散乱“\”等)。 我认为那个问题是由新行引起的,但若我只是在一行中编写脚本,那个么脚本就不起作用了。我试图使用\n,但这对我没有帮助


因此,我不能简单地将脚本复制并粘贴到C文件中,它需要一些处理首先,C的字符串化可以帮助您简化多行字符串:

char *script = "expect -c 'spawn ssh user@host cat /proc/stat\n\n"
               "expect {\n"
               "-re \".*yes/no.*\"\n"
               "send \"yes\\r\"\n"
               ...
编译器将很乐意为您将所有这些字符串组合在一起

当然,请注意,
\n
在编译时在字符串中变成换行符,而
\\r
在编译时在字符串中变成
\r
,expect有望在运行时变成回车符


第二件事,您确定将expect脚本嵌入到可执行程序中是正确的方法吗?您登录的主机可能会随之改变;如果脚本与可执行文件分开,那么替换脚本就容易多了。(我无法告诉你我一生中写了多少个pppd聊天脚本,我只是很高兴它不需要重新编译pppd就能让它们工作!)

首先,C的字符串化可以帮助你让多行字符串看起来更简单:

char *script = "expect -c 'spawn ssh user@host cat /proc/stat\n\n"
               "expect {\n"
               "-re \".*yes/no.*\"\n"
               "send \"yes\\r\"\n"
               ...
编译器将很乐意为您将所有这些字符串组合在一起

当然,请注意,
\n
在编译时在字符串中变成换行符,而
\\r
在编译时在字符串中变成
\r
,expect有望在运行时变成回车符

第二件事,您确定将expect脚本嵌入到可执行程序中是正确的方法吗?您登录的主机可能会随之改变;如果脚本与可执行文件分开,那么替换脚本就容易多了。(我无法告诉你我一生中写了多少个pppd聊天脚本,我只是很高兴它不需要重新编译pppd就可以工作!)

如果你在C程序中硬编码“脚本”,你需要遵循C规则:这意味着避开嵌入的双引号和反斜杠

const char script[] =
    "expect -c 'spawn ssh  user@host cat /proc/stat\n"
    "expect { -re \".*yes/no.*\" { send \"yes\\r\" exp_continue }\n"
    "             \"password:\" { send -- \"password\\r\" }\n"
    "       }\n"
    "interact'\n"
请注意,我还使用C换行符转义码“\n”终止了这些行。

如果在C程序中硬编码“脚本”,则需要遵循C规则:这意味着转义嵌入的双引号和反斜杠

const char script[] =
    "expect -c 'spawn ssh  user@host cat /proc/stat\n"
    "expect { -re \".*yes/no.*\" { send \"yes\\r\" exp_continue }\n"
    "             \"password:\" { send -- \"password\\r\" }\n"
    "       }\n"
    "interact'\n"

请注意,我还使用C换行符转义码“\n”终止了这些行。

为什么需要转义此脚本的内容?只有在将字符串或字符文本写入C源节点时才需要转义,而从外部文件读取数据时不需要转义。您尝试过什么转义序列,结果如何?如果不转义,我在编译时会出错(“在`*'”之前出现语法错误”、“程序中出现“游离的”\'等)。我认为那个问题是由新行引起的,但若我只是在一行中编写脚本,那个么脚本就不起作用了。我试图使用\n,但这对我没有帮助。所以,我不能简单地将脚本复制并粘贴到C文件中,它需要一些处理为什么需要转义这个脚本的内容?只有在将字符串或字符文本写入C源节点时才需要转义,而从外部文件读取数据时不需要转义。您尝试过什么转义序列,结果如何?如果不转义,我在编译时会出错(“在`*'”之前出现语法错误”、“程序中出现“游离的”\'等)。我认为那个问题是由新行引起的,但若我只是在一行中编写脚本,那个么脚本就不起作用了。我试图使用\n,但这对我没有帮助。所以,我不能简单地复制和粘贴脚本到C文件,它需要一些处理谢谢!你的建议对我很有用。关于嵌入-在我的情况下,这并不坏。所有依赖项、地址等都是硬编码的,所有系统作为一个整体工作。地址、密码和用户名永远不会更改。谢谢!你的建议对我很有用。关于嵌入-在我的情况下,这并不坏。所有依赖项、地址等都是硬编码的,所有系统作为一个整体工作。地址、密码和用户名永远不会更改。