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