簡體   English   中英

每兩個字符反轉一次輸入

[英]Reversing input every two characters

我一直在嘗試制作一個程序,該程序需要一個地址,並每兩個字符反轉一次。 輸入示例為“ 0xefba5896”,理想情況下,其輸出為“ \\ x96 \\ x58 \\ xba \\ xef”。 我遇到的麻煩是前幾個字節有效,但最后一個不打印。 我的代碼如下:

     int i;
     char *add =  argv[1];
     char rev[8];
     char xa[2];
     strncpy(rev, &add[2], strlen(add));   
     for (i = strlen(rev) - 2; i > -2; i-=2) {
                if (i == 0) {
                    strncpy(xa, &rev[0], 2);
                 } else {
                    strncpy(xa, &rev[i], 2);
                    xa[2] = '\0';
            }
                printf("\\x%s", xa);
     }

如果輸入“ 0xefba5896”,則輸出為:

\x96\x58\xba\x

如果答案對某人顯而易見,請原諒我。 我已經學習C大約一個星期了。 任何幫助將不勝感激!

strlen(add)作為限制因素傳遞給strncpy沒有意義,如果add大於10,您仍然會溢出rev

您必須傳遞目標的大小,而不是源的大小。 所以正確的電話是

strncpy(rev, add+2, sizeof rev);
rev[sizeof(rev) - 1] = 0;

還要注意,如果目標的時間不夠長, strncpy不一定會寫入'\\0'終止字節,因此您應始終自行設置'\\0'終止字節。

還要注意xa[2] = '\\0'; 溢出xa ,因為大小xa為2,最大索引是1 如果要在xa存儲2個字符,則xa尺寸至少應為rev 因此,您必須將xa聲明為:

char rev[9];
char xa[3];

因此,當您使用strncpy ,應該這樣使用它:

char dest[8];
strncpy(dest, src, sizeof dest);
dest[sizeof(dest) - 1] = 0;

因此,您可以像這樣重寫程序:

int main(int argc, char **argv)
{
    if(argc != 2)
    {
        fprintf(stderr, "usage: %s address\n", argv[0]);
        return 1;
    }

    size_t len;
    char *add =  argv[1];
    char rev[9];
    char xa[3];  

    strncpy(rev, add + 2, sizeof rev);
    rev[sizeof(rev) - 1] = 0;

    len = strlen(rev);

    if(len & 1)
    {
        fprintf(stderr, "Invalid length of address, needs an even number of characters\n");
        return 1;
    }

    for(size_t i = len - 2; i >= 0; i -= 2)
    {
        strncpy(xa, rev + i, sizeof xa);
        xa[sizeof(xa) - 1] = 0;

        printf("\\x%s", xa);
        fflush(stdout);
    }

    putchar('\n');

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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