c - 如何将控制字符或非打印字符传递给 C 程序?

标签 c command-line-arguments control-characters

情况:我有一个 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/

相关文章:

c - 以字节为单位读取文件中的可打印 ASCII 字符

c# - C# 字符串中控制字符的转义码

Hadoop - textouputformat.separator 使用 ctrlA ( ^A )

c - C语言命令行求三角形面积

c - 如何禁用 avr-gcc 的 "appears to be a misspelled interrupt handler"警告?

c - 'asm' 、 '__asm' 和 '__asm__' 之间有什么区别?

c - 如何在 C 中使用作为参数从命令行传入的文本文件?

c# - Word 命令行参数空间问题

command-line-interface - 如何删除/禁用 gcloud CLI 命令的输出消息

xml - 转义 Oracle XDB 中的控制字符