从c

时间:2016-03-16 01:12:09

标签: c posix c-strings ansi-escape

我正在尝试在C中编写一个名为echo的小型echo程序,仅使用C STD库和C Posix库,基于对posix echo程序应该执行的操作的SUSv4描述。但是,在测试解析转义码时,我遇到了麻烦。

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

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]);
    }
}            

这适用于大多数应用程序,但是当我开始调试转义码的逻辑时,我的麻烦特别是'\'。如果我从命令行传递给我的程序:

echo "Hello\nWorld"

结果如预期:

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标准还是两者的某种组合?

2 个答案:

答案 0 :(得分:0)

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

在这种情况下,传递给程序的输入也会有所不同,从而导致程序的结果/输出。

答案 1 :(得分:0)

如评论中所述,shell正在扩展转义。

BusyBox在几个方面与POSIX不同;如果echo逃脱是其中之一,那就不足为奇了。顺便说一下它似乎不是一个GNU项目,所以它只是&#34; BusyBox&#34;。

与其他shell(包括bash 4.2)比较:

$ ksh
$ echo "Hello\\nWorld"
Hello\nWorld
$ bash
$ echo "Hello\\nWorld"
Hello\nWorld
$ dash
$ echo "Hello\\nWorld"
Hello
World

进一步阅读: