为什么在命令行参数的情况下将命令char double指针转换为char不起作用?

问题描述 投票:-1回答:2

这是代码

#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之前正确打印,但可能由于我完成了一些错误,我无法识别它。

任何人都可以通过解释纠正我的错误吗?

c command-line-arguments endianness
2个回答
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


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

}
© www.soinside.com 2019 - 2024. All rights reserved.