情况:我有一个 C 程序,它接受一个字符串参数并对其进行处理(详细信息不相关。)我想向它传递一个包含控制字符(例如 EOF、CR 或 LF)的字符串,并且无法在终端中将键盘切换到原始输入模式。我的问题是:C 是否有任何功能可以让我以某种方式指示或“键入”字符? (例如,在用某些语言创建字符串时,您可以使用斜杠转义字符或指示它们的十六进制代码。我想知道从终端内部向 C 程序传递参数是否存在类似的情况 - 所以我问的是特别是命令行参数。)
最佳答案
您可能想了解如何在 bash 中将二进制数据作为参数传递。请参阅this question .
这是一个用 C 编写的简短演示。该程序以十六进制形式逐个字符地打印出传递给它的每个参数。
/* compile with cc -o binarg binargs.c */
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
char *ip;
printf("\n");
for(i=0; i<argc; i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
for(ip=(char*)argv[i]; *ip!=0; ip++)
{
printf("0x%02X <-\t`%c'\n",*ip,*ip);
}
printf("\n");
}
return 0;
}
让我们按照上面提到的帖子中的说明向其传递二进制参数。
./binargs ABC $'\x41\x42\x43' $'\t\n'
结果:
argv[0]=./binargs 0x2E <- `.' 0x2F <- `/' 0x62 <- `b' 0x69 <- `i' 0x6E <- `n' 0x61 <- `a' 0x72 <- `r' 0x67 <- `g' 0x73 <- `s' argv[1]=ABC 0x41 <- `A' 0x42 <- `B' 0x43 <- `C' argv[2]=ABC 0x41 <- `A' 0x42 <- `B' 0x43 <- `C' argv[3]= 0x09 <- ` ' 0x0A <- ` '
argv[0] 是我们的程序 binargs
本身的名称
argv[1] 是一个常规字符串“ABC”
argv[2] 与 argv[1] 相同,但为十六进制
argv[3] 是两个控制字符的序列:HT LF
注意,它使用传统的Unix方式来引用每个字符,因此我们可以在打印时看到不可打印字符的边界:
./binargs $'\a\b\v\f'
(让我们跳过 argv[0] 部分)
argv[1]= 0x07 <- `' 0x08 <- ' 0x0B <- ` ' 0x0C <- ` '
或者我们可以将其通过管道传输到 cat -v
./binargs $'\a\b\v\f' | cat -v
这使得结果更具可读性:
argv[1]=^G^H^K^L 0x07 <- `^G' 0x08 <- `^H' 0x0B <- `^K' 0x0C <- `^L'
关于c - 如何将控制字符或非打印字符传递给 C 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16326343/