为什么在命令行参数的情况下无法将命令char双指针转换为char呢?

时间:2018-09-10 11:42:22

标签: c command-line-arguments endianness

这是代码

#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之前,它可以正确打印,但可能是我犯了一些强制转换错误,我无法识别它。

有人可以通过解释纠正我的错误吗?

2 个答案:

答案 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()将字符串转换为整数
  • 我的身份证或 E 我的身份证?


#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]);
    }

}