![](/img/trans.png)
[英]reading and printing escape characters from a command line argument (in hex) using C
[英]Printing escape characters from strings read in from the command line in c
我想寫回聲命名為定義的小的反響程序在這里只使用基於的POSIX回聲程序應該做哪些SUSv4描述C STD庫和C的Posix庫℃。 但是,在測試我的轉義代碼解析時遇到了麻煩。
我的算法很簡單,只需遍歷字符串數組,檢查每個字符是否在尋找“ \\”,如以下代碼片段所示:
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正在擴展轉義符。
BusyBox在幾個方面與POSIX不同。 如果echo
轉義是其中之一就不足為奇了。 順便說一句,它似乎不是GNU項目,因此它只是“ BusyBox”。
與其他shell(包括bash 4.2)相比:
$ ksh
$ echo "Hello\\nWorld"
Hello\nWorld
$ bash
$ echo "Hello\\nWorld"
Hello\nWorld
$ dash
$ echo "Hello\\nWorld"
Hello
World
進一步閱讀:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.