在c中从命令行读取的字符串中打印转义字符
我试图根据Posix echo程序应该做什么的SUSv4描述,仅使用C STD库和C Posix库编写一个名为echo的小echo程序,该程序在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] == '\\'
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