这是代码
#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之前正确打印,但可能由于我完成了一些错误,我无法识别它。
任何人都可以通过解释纠正我的错误吗?
(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
。
您的代码的主要问题是您使用不兼容的类型转换&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]);
}
}