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

标签 c posix c-strings ansi-escape


我正在尝试编写一个名为 echo 的小型 echo 程序,定义为 here在 C 中,仅使用 C STD 库和 C Posix 库,基于 SUSv4 对 posix echo 程序应该做什么的描述。但是,我在测试转义码解析时遇到了障碍。

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

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 回显程序是否不遵循 POSIX 标准,或者是两者的某种组合?

最佳答案

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

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

关于c - 从c中的命令行读取的字符串中打印转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36025133/

相关文章:

c - 确定字符串相等比较失败的位置

c++ - line.find 不会编译,行未声明

c - 如何在 C 中打印 int 的大小?

c - 试图了解 C 中不同的输入方式是如何发生的,但 fgets() 往往会跳过

c++ - posix 中的健壮 rwlock

c - 如何将多个结构实例存储在共享内存中?

linux - 使用 clock_gettime(CLOCK_MONOTONIC) 在 CPU 间移动线程

C编程与计算

c - 如何检查CSP或PKCS创建的证书和 key 对?

c++ - 将 c 字符串的地址转储到 ostream?