Передача аргумента делает указатель из целого числа без приведения - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть функция с именем token2char, которая передается в массиве символов с именем token с размером массива 1024. Я перебираю каждый символ, определяя, является ли он шестнадцатеричным (предполагается, что значение Hex всегда равно 2, например0xFF) или целое число от 0 до 255. Значения перемещаются в новый массив символов hex и dec соответственно, которые затем передаются другой функции, которая преобразует ее в ASCII.Сокращенная версия моего кода для шестнадцатеричного кода приведена ниже.

void token2char(char token[1024]){
    // Iterate through each character in token
    for (int i = 0; i < maxInputLength; i = i + 1){
        // Ignore spaces, move to next char in token
        if (token[i] == ' '){}

        // Is Hex?
        else if (token[i] == '0' && (token[i+1] == 'x' || token[i+1] == 'X')){
            char hex[4];
            strcpy(hex, token[i,i+1,i+2,i+3]);
            hexConv(hex);
        }
    }
}

strcpy выдает ошибку, определенную в заголовке, но я не уверен, почему.Я пытался вызвать & токен или * токен внутри strcpy, но безрезультатно.

Ответы [ 2 ]

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

Размещенный код далек от компиляции. И.Е. Есть много проблем, кроме неправильного параметра strcpy()

Следующий предложенный код:

  1. предостережение: не обрабатывает угловые случаи
  2. предостережение: не обрабатывает десятичные числа
  3. устраняет ненужное копирование данных
  4. чисто компилирует
  5. избегает «магических» чисел
  6. изменяет функцию hexConv (), чтобы она возвращала счетчик количества использованных символов
  7. использует системный заголовочный файл: 'ctype.h' средство 'isspace ()'

и теперь предложенный код:

#include <ctype.h>

// avoid 'magic' numbers
#define MAX_INPUT_LENGTH 1024


//prototypes
void token2char( char * );
int  hexConv( char * );  // returns num of chars used


void token2char( char token[ MAX_INPUT_LENGTH ] )
{
    // Iterate through each character in token
    for ( int i = 0; i < MAX_INPUT_LENGTH; i++ )
    {
        // Ignore spaces, move to next char in token
        if ( !isspace( token[i] ) )
        {
            if ( token[i] == '0' 
                && (token[i+1] == 'x' || token[i+1] == 'X') )
            {
                int charsUsed = hexConv( &token[i] );
                i += charsUsed;
            }
        }
    }
}
0 голосов
/ 13 сентября 2018
token[i,i+1,i+2,i+3]

интерпретируется как

token[i+3]

, поскольку запятая является оператором .

Вместо этого следует использовать

strncpy(hex, &token[i], 4);

или

memcpy(hex, &token[i], 4);

.

...