我正在尝试编写一个名为 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/