2016-11-14 7 views
-1

Итак, я студент первого курса C, и я работаю над проектом, в котором мы должны создать таблицу времени в заданной базе, которую вводит пользователь. Я почти полностью закончил его, но у меня возникли проблемы с удалением ведущих нулей из таблицы.Переназначение строкового значения в C

Это то, на что похож простой стол базы 10.

[email protected] ~/cs211/project1 $ ./timesTable 10 

    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |  
---|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----| 
0 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 
1 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 
2 | 00 | 02 | 04 | 06 | 08 | 10 | 12 | 14 | 16 | 18 | 
3 | 00 | 03 | 06 | 09 | 12 | 15 | 18 | 21 | 24 | 27 | 
4 | 00 | 04 | 08 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 
5 | 00 | 05 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 
6 | 00 | 06 | 12 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 
7 | 00 | 07 | 14 | 21 | 28 | 35 | 42 | 49 | 56 | 63 | 
8 | 00 | 08 | 16 | 24 | 32 | 40 | 48 | 56 | 64 | 72 | 
9 | 00 | 09 | 18 | 27 | 36 | 45 | 54 | 63 | 72 | 81 | 
---|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----| 

Я хочу удалить ведущие нули из каждого числа, но я изо всех сил стараюсь заставить его работать. Вот как выглядит код функции.

char * toHex(int n, int q){ 

    static char hexNumber[4] = {0x00}; 
    char digits[16]={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 

    unsigned int un = q; 


    int i; 

    for(i=1; i>=0; i--){ 
     hexNumber[i] = digits[un%n]; 
     un=un/n;   
    } 
    if(strcmp(hexNumber, "0") == 0){ 
     hexNumber = " "; 
    } 
    return hexNumber; 
} 

Используя мою логику, я пытаюсь передать строку HexNumber на пустой «» строку, так что нули просто не появляются, но я получаю сообщение об ошибке:

timesTable.c: In function ‘toHex’: 
timesTable.c:68:13: error: incompatible types when assigning to type ‘char[4]’ from type ‘char *’ 
    hexNumber = " "; 

Любой помощь был бы весьма признателен.

+0

Извините за испорченное форматирование этого сообщения. Я новичок и не получил разметки –

+0

Использование «memcpy (hexNumber,« ", 2)» исправил ошибку, но не удаляет нули. –

+0

Когда вы говорите, что удаляете ведущие нули, вы имеете в виду, что вместо «01» должно быть «1»? Ваш код просто установит hexNumber в пробел, если это «0», что, как я думаю, никогда не произойдет. – sudo

ответ

0

Вы не можете переназначить типы char[], и вы не можете изменить const char[]. Так что вы должны сделать:

  • char hexNumber[4] = {0x00};

И когда вы хотите назначить:

  • memcpy(hexNumber, " ", 2) (если вы strings.h импортирован)
  • hexNumber[0] = ' '; hexNumber[1] = '\0'; (если вы не» t хотите что-либо импортировать)

Редактировать: Вышеописанное исправляет ошибку. Для правильности вашей программы, возможно, это то, что вы хотите заменить своим кодом if(strcmp...?

for (i = 0; i < 3; i++) { 
    if (hexNumber[i] == '0') { 
     hexNumber[i] = ' '; 
    } else { 
     break; 
    } 
} 

Это будет проверять с начала строки для 0 символов, заменив их пробелами, пока он не достигнет не-0 характер.

Вы также не можете вернуть hexNumber если определить его как массив на вашем стеке, поэтому вместо того, чтобы сделать char* hexNumber = malloc(4); затем memset(hexNumber, '\0', 4) (убедитесь, что вы import <strings.h> в верхней части). Это выделяет его на кучу вместо стека. Независимо от того, какие вызовы для этой функции потребуется, в итоге получится результат free, иначе у вас будет утечка памяти. Кроме того, вы можете заставить эту функцию принять hexNumber в качестве входных данных и заставить вызывающего абонента выделять ее, но она хочет, что и многие функции библиотеки C, связанные со строками.

+0

Итак, теперь я получаю: andrew @ andrew-VirtualBox ~/cs211/project1 $ gcc -g -Wall -o timesTable timesTable.c разTable.c: В функции 'toHex': timesTable.c: 72: 1: warning: функция возвращает адрес локальной переменной [-Wreturn-local-addr] return hexNumber; ^ И он не удаляет нули. –

+0

Правильно ... Вы не должны возвращать 'hexNumber', поскольку он находится в стеке для этой функции. Я просто думал об исправлении синтаксических ошибок. Редактирование ответа. Вам нужно будет malloc вместо создания в стеке. И не забудьте освободить его после. – sudo

+1

Код, который вы предложили заменить strcmp. Я на самом деле попробовал решение, очень похожее на то, что раньше, но не получило его на работу. Это заставило меня искать более сложные маршруты. Спасибо за помощь, я рад, что это было намного проще, чем я думал. –

Смежные вопросы