在c中从命令行读取的字符串中打印转义字符

在c中从命令行读取的字符串中打印转义字符,c,posix,c-strings,ansi-escape,C,Posix,C Strings,Ansi Escape,我试图根据Posix echo程序应该做什么的SUSv4描述,仅使用C STD库和C Posix库编写一个名为echo的小echo程序,该程序在C中定义。然而,在测试转义码的解析时,我遇到了一个障碍 我的算法很简单,只需在字符串数组中循环检查每个字符以查找“\”,如以下代码段所示: for(innerloop = 0;innerloop < strlen(singlestring);innerloop++) { if(singlestring[innerloop] == '\\'

我试图根据Posix echo程序应该做什么的SUSv4描述,仅使用C STD库和C Posix库编写一个名为echo的小echo程序,该程序在C中定义。然而,在测试转义码的解析时,我遇到了一个障碍

我的算法很简单,只需在字符串数组中循环检查每个字符以查找“\”,如以下代码段所示:

for(innerloop = 0;innerloop < strlen(singlestring);innerloop++)
{
    if(singlestring[innerloop] == '\\' && innerloop + 1 < strlen(singlestring))
    {
        switch(singlestring[innerloop+1])
        {
            case 'a':
                    printf("\a");
                    break;
            case 'b':
                    printf("\b");
                    break;
            case 'c':
                    cescape = 1;
                    innerloop = strlen(singlestring);
                    break;
            case 'f':
                    printf("\f");
                    break;
            case 'n':
                    printf("\n");
                    break;
            case 'r':
                    printf("\r");
                    break;
            case 't':
                    printf("\t");
                    break;
            case 'v':
                    printf("\v");
                    break;
            case '0':
                    /*not implemented yet*/
                    break;
            default: /*character = '\\'*/
                   printf("\\");
                   innerloop--;
                   break;
        }
        innerloop++;
    }
    else
    {
        printf("%c",singlestring[innerloop]);
    }
}            
结果如预期:

Hello
World
但是,当我向字符串添加额外的“\”时:

echo "Hello\\nWorld"
结果出乎我的意料,因为我希望输出是“Hello\nWorld”,但我的gnu echo和busybox echo基线似乎是一致的

Hello
World
然而,分歧点出现在多个“\”之后

echo "Hello\\\nWorld"
我的结果:

Hello\
World
Gnu/Busybox的回波结果

Hello\nWorld
该模式现在只需添加更多的“\”字符即可重复自身


我的算法是否存在根本缺陷,不符合POSIX规范,或者GNU和Busybox echo程序是否不符合POSIX标准,或者是两者的某种组合?

此处发布的输出是否仅通过linux shell或程序的“echo”命令生成?如果它来自shell,那么shell可能会以不同的方式处理转义字符


在这种情况下,传递给程序的输入也会不同,因此程序的结果/输出也会不同。

如注释中所述,shell正在扩展转义

BusyBox在几个方面与POSIX不同;如果
回音
转义就是其中之一,也就不足为奇了。顺便说一句,它似乎不是GNU项目,所以它只是“BusyBox”

与其他Shell(包括bash 4.2)相比:

进一步阅读:

  • (斯文·马斯切克的页面)

当您使用
echo
而不使用
echo-e
(或
printf
)时,shell将转义解释为文本。它永远不会进入您的程序…您是否尝试过不执行
innerloop--当你看到一个\\?目前,当你看到一个\\时,你跳过它并打印一个\(正如预期的那样),但出于某种原因,你让计算机再次返回一个字符。然后它将\\中的第二个\视为新转义序列的第一部分。这与其说是答案,不如说是注释
Hello\nWorld
$ ksh
$ echo "Hello\\nWorld"
Hello\nWorld
$ bash
$ echo "Hello\\nWorld"
Hello\nWorld
$ dash
$ echo "Hello\\nWorld"
Hello
World