这是代码
#include <stdio.h>
//#include "ConvertEndianess.h"
typedef unsigned char uint8_t;
void ConvertEndianess(uint8_t* buffAddr, uint8_t length);
void ConvertEndianess(uint8_t *buffAddr, uint8_t length)
{
uint8_t i;
uint8_t data;
for (i = 0U; i < (length / 2U); i++)
{
data = buffAddr[i];
buffAddr[i] = buffAddr[(length - 1U) - i];
buffAddr[(length - 1U) - i] = data;
}
}
int main(int argc, char *argv[]){
printf("\nNumber Of Arguments Passed: %d\n",argc);
if(argc < 3){
printf("Too Few Arguments\n");
}
else if(argc > 3){
printf("Too Many Arguments\n");
}
else{
printf("data indianess: %s\n",argv[1]);
ConvertEndianess((uint8_t *)&argv[1], (uint8_t)(*argv[2]));
printf("data indianess: %s\n",argv[1]);
}
}
这是我的论点:
./ a 11223344 4
在使用转换API之前,它可以正确打印,但可能是我犯了一些强制转换错误,我无法识别它。
有人可以通过解释纠正我的错误吗?
答案 0 :(得分:0)
(uint8_t)(*argv[2])
argv[2]
是char *
,并且根据您的程序的运行方式,我认为它应该包含缓冲区的大小。由于这是一个字符串(char *),并且要将其转换为数字,因此需要使用sscanf来获取该值:
样品用量:
size_t len;
sscanf(str, "%zu", &len);
然后传递len
作为转换函数的第二个参数。
您目前的操作方式是为argv[2]
的第一个字符传递ASCII码。因此,如果用户说大小为"7"
,则实际上是将整数55
传递给转换函数。
请注意,使用size_t
代表大小,而不是uint8_t
。
答案 1 :(得分:0)
代码上的主要问题是,您使用不兼容的类型强制转换了&argv[...]
。
argv[...]
是char*
,所以&argv[...]
是一些char**
,您将其强制转换为不兼容的uint8_t*
。
一些评论:
&
之前输入argv[...]
:strlen()
而不是传递参数strtol()
将字符串转换为整数
#include <stdio.h>
#include <string.h> /* strlen */
#include <stdlib.h> /* strtol */
typedef unsigned char uint8_t;
void ConvertEndianess(uint8_t *buffAddr, uint8_t length)
{
uint8_t i;
uint8_t data;
for (i = 0U; i < (length / 2U); i++)
{
data = buffAddr[i];
buffAddr[i] = buffAddr[(length - 1U) - i];
buffAddr[(length - 1U) - i] = data;
}
}
int main(int argc, char *argv[]){
printf("\nNumber Of Arguments Passed: %d\n",argc);
if(argc == 2){
/* exemple with strlen */
printf("data Endianess: %s\n",argv[1]);
ConvertEndianess(argv[1], strlen(argv[1]));
printf("data Endianess: %s\n",argv[1]);
}
else if(argc == 3){
/* exemple with strtol */
printf("data Endianess: %s\n",argv[1]);
ConvertEndianess((uint8_t *)argv[1], strtol(argv[2], NULL, 0));
printf("data Endianess: %s\n",argv[1]);
}
}