gpt4 book ai didi

c - 每两个字符反转输入

转载 作者:行者123 更新时间:2023-11-30 16:33:33 25 4
gpt4 key购买 nike

我一直在尝试编写一个程序,该程序获取一个地址并为每两个字符反转它。示例输入为“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语言才一周左右。任何帮助将不胜感激!

最佳答案

如果 add 长度超过 10,则将 strlen(add) 作为限制因素传递给 strncpy 是没有意义的,你仍然会溢出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 需要至少具有 3 维。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;
}

关于c - 每两个字符反转输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49712894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com