2017-01-13 3 views
-2

Когда я пытаюсь преобразовать char[] в char* есть ненужные символы добавляются к char* переменнойПреобразование строки на символ *

int keySize = getKeySize(key2); 
char* key = (char*)malloc(sizeof(keySize)); 
int i; 
char s[keySize-1]; 
int i2; 

for(i2=0; i2<keySize; i2++) 
{ 
    s[i2] = getCharacter(key2, i2); 
} 

strncpy(key, s, keySize); 
+0

Пожалуйста, более конкретно, то, что вы хотите сделать и что на самом деле происходит. Но последняя итерация циклов записывает не выделенную память (1 за вашим массивом), так что это уже UB. –

+0

sizeof (keySize) возвращает размер int, который обычно составляет 4 байта. вы уверены, что это то, что вы хотите? после этого вы копируете (keySize) количество байтов в ключ – user3109672

+1

'char s [keySize-1];' неверно, если ключ был '1', вы пытаетесь выделить память для' 0' байт. Избавьтесь от '-1'. Кроме того, 'sizeof (keysize)' вернет вам размер переменной в памяти, которая равна 4/8 байтам в вашем случае, избавиться от 'sizeof'. Это, однако, не решит вашу проблему. Расширьте свой вопрос и покажите нам код функции 'getCharacter()'. – ProXicT

ответ

0
  1. Хотя выделения, следует выделить один больше, чем размер. В настоящее время вы выделяете только 4 байта.

    char* key = (char*)malloc(keySize+1); 
    //instead of 
    char* key = (char*)malloc(sizeof(keySize)); 
    
  2. s должны иметь размер keySize+1

    char s[keySize+1]; 
    // instead of 
    char s[keySize-1]; 
    
+0

Фактически, ему не нужно добавлять '+ 1' в размер массива, если он не делает, t хочет строку с нулевым завершением, однако он не предоставляет достаточной информации о том, что он собирается делать. – ProXicT

+0

По-прежнему делает то же самое значение ключа «может ° <<<<<<< ...» при отладке – harleydave22

+0

@ harleydave22 Вам также необходимо изменить 'strncpy' на' strncpy (key, s, keySize + 1); 'включить ограничитель строки. Или добавьте его явно, если исходная строка не 'NUL'-terminated –

1

Там нет типа данных строки в языке программирования C. Строки в C представлены в виде массива символов.

Примечание: C-строки являются символьным массивом, заканчивающимся символом '\ 0'. Это означает, что последний символ в любой C-String в C будет использоваться для хранения символа '\ 0', который отмечает конец строки. Чтобы сохранить n символов в C-String в C, вы должны определить массив символов размером (n+1).

Почему мы должны прекратить его с помощью '\ 0'?

'\0' termination это то, что отличает char array от c-string в C programming language. Большинство функций управления строкой (например, strcpy) полагаются на символ «\ 0», чтобы знать, когда строка завершена (и ее работа завершена!), И не будет работать с простым char-массивом (например, они будут продолжать работая за границами массива, и продолжайте, пока он не найдет символ «\ 0» где-то в памяти - часто развращает память по мере ее поступления).

Поэтому сохранение символа '\ 0' (в конце) необходимо, если вы хотите использовать функции #include <string.h>, например strcpy(), поскольку они полагаются на символ '\ 0', чтобы пометить конец массива символов.

'\ 0' определяется как пустой символ - это символ со всеми битами, установленными в ноль (и, следовательно, имеет значение 0). Это не имеет никакого отношения к указателям. Узнайте больше об этом here.

В вашей программе, вы хотите, два символьных массива key (dynamically allocated) и s держать копию другого массива символов key2 размера keysize. Затем оба массива символов должны быть по крайней мере keysize + 1 (+1 для сохранения символа '\ 0').

Изменение:

char* key = (char*)malloc(sizeof(keySize)); 

To:

char* key = malloc(keySize+1); // Don't Type-Cast malloc 

И

Изменение:

char s[keySize-1]; 

Для

char s[keySize+1]; 
+2

Исправление: «Нуль» не существует. Это либо CL-слово «null», либо ASCII 'nul' (нижний регистр, чтобы избежать путаницы с' NULL'), или, как вы далее написали '' \ 0'', что я рекомендую использовать в этом контекст. Это никогда не было ** 'NULL', который является макросом с константой константы _null_, очень различной семантикой и, как правило, совсем другим типом (' void * '). Или просто '0'. – Olaf

+0

Снова прочитайте мой комментарий. Синтаксис имеет значение. И, пожалуйста, используйте только код-уценку для кода, а не обычный текст. – Olaf

+0

Я отредактировал свой ответ! – abhiarora

0

Как насчет этого? Есть некоторые ошибки о размерности с, я предлагаю вам ту использовать strncpy

 #include <string.h> 
    int main(){ 
      //bla bla ... 
     int keySize = getKeySize(key2); 
     char* key = malloc(keySize+1);; 
     int i2; 

     for(i2=0; i2<keySize; i2++){ 
     s[i2] = getCharacter(key2, i2); 
     } 
     char s[keySize+1]; 
     strncpy(s, key, sizeof s - 1); 
     s[keySize] = '\0'; 
     r 

return 0; 
} 

Во всяком случае больше информации об этом, пожалуйста, я должен ты хотел это

+0

Закрыть! Я хочу, чтобы код мог назначать один и тот же ключ для входов, которые являются одинаковыми. Когда я отлаживаю ваш код, адрес ключа отличается, когда массив в s одинаковый. – harleydave22

+1

Это начало хэш-функции. – harleydave22

+0

Значение в s успешно скопировано, но адрес меняется каждый раз, я запускаю программу, я бы например, адрес ключа должен быть одинаковым, если две строки одинаковы. – harleydave22

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