[英]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.