Почему преобразование двойного указателя char в char не работает в случае аргумента командной строки? - PullRequest
0 голосов
/ 10 сентября 2018

Вот код

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

Вот мой аргумент:

. / 11223344 4

Перед печатью API преобразования печатается правильно, но, возможно, я сделал какую-то ошибку, и я не могу ее идентифицировать.

Может кто-нибудь исправить ошибку с объяснением?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Основная проблема в вашем коде заключается в том, что вы используете &argv[...] с несовместимым типом.

argv[...] - это char*, поэтому &argv[...] - это какое-то char**, и вы разыгрываете его как uint8_t*, что несовместимо.

Некоторые замечания:

  • Вы не должны вводить & до argv[...]:
  • Вы можете использовать strlen() вместо передачи аргумента
  • Вы можете использовать strtol() для преобразования строки в целое число
  • I Индийская или 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]);
    }

}
0 голосов
/ 10 сентября 2018
(uint8_t)(*argv[2])

argv[2] - это char * и в зависимости от того, как работает ваша программа, я предполагаю, что она должна содержать размер буфера. Поскольку это строка (char *), и вы хотите преобразовать ее в число, вам нужно использовать sscanf, чтобы получить это значение:

Пример использования:

size_t len;
sscanf(str, "%zu", &len);

Затем передайте len в качестве второго аргумента вашей функции преобразования.

То, как вы это делаете, в настоящее время передает код ASCII для первого символа argv[2]. Поэтому, если пользователь сказал, что размер "7", вы фактически передаете целое число 55 в функцию преобразования.

В качестве дополнительного примечания используйте size_t для представления размера, а не uint8_t.

...