簡體   English   中英

打印從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM