2016-01-24 4 views
0

Так что я пытаюсь сделать строку в двоичный метод в C. Вот мой код до сих пор:массив символов в двоичный массив не работает

int main(int argc, char **argv) { 
    convertStringToBits("hello"); 
} 

char *convertStringToBits(char **string) { 
    int i; 
    int stringLength = strlen(string); 
    int mask = 0x80; /* 10000000 */ 
    char charArray[stringLength * 8]; //* 8 for char bits? 

    for(i = 0; i < (sizeof(string)/sizeof(char)) + 1; i++) { 
     mask = 0x80; 
     char c = string[i]; 
     while(mask > 0) { 
      printf("%d", (c & mask) > 0); 
      mask >>= 1; /* move the bit down */ 
      //add to char array 
     } 
     printf("\n"); 
    } 

    return charArray; 
} 

Ожидаемый выход: hello должно быть:

01101000 
01100101 
01101100 
01101100 
01101111 

но я получаю это:

01101000 
01101111 
01100011 
00100000 
01011011 

Я также хочу, чтобы вернуть массив символов, но я не могу это сделать.

Спасибо за помощь!

+2

'SizeOf (Char)' всегда 1. –

+0

@iharob не на всех системах, я не думаю, что (например, Raspbian) – madcrazydrumma

+2

Это обязательное по стандарту. Это должно быть 1. Если 'CHAR_BITS' равно 8 или нет, это что-то еще, кроме' sizeof (char) 'ДОЛЖНО быть 1. –

ответ

3

Oopsie:

char **string 

Вы хотите передать строку, то есть символ *. Вместо этого вы указываете указатель на указатель.

Этот

int stringLength = (sizeof(string)/sizeof(char)) + 1; 

, кажется, работает случайно, потому что sizeof(string) возвращает 4 (размер указателя) на вашей платформе и "Hello" 5 символов. Вы хотите

int stringLength = strlen(string); 

Это также не будет работать:

char charArray[stringLength * 8]; //* 8 for char bits? 

, потому что только его память "живет" внутри функции. Для того, чтобы передать его на улице, необходимо выделить его с помощью таНос():

char *charArray; 
charArray = malloc(8*stringLength+1); 
// Check that malloc returned a valid pointer. It's almost certain 
// that it will, but the one time it might return NULL... 
if (charArray == NULL) { 
    // ...you want to know it. Using charArray now would crash. 
    printf("An error occurred\n"); 

    // Either return something harmless or something that will 
    // show to the upstream code that an error occurred. 
    return NULL; 
} 
+0

Ужасно 'NULL == charArray' Я даже не могу смотреть на него. И почему бы вам вместо этого не использовать 'CHAR_BITS'? Также внимательно прочитайте код. –

+2

@iharob - Это не страшно - это конвенция йода. –

+0

@EdHeal Я знаю, я так сильно его ненавижу. Мне трудно понять. Я знаю, что это предотвращает случайное назначение, но читать это неестественно. –

4

Ваш расчет stringLength неверен, sizeof является оператором, и он дает вам размер типа, объекты с типом массива, конечно, возвращают размер массива. Но ваша переменная string не является массивом, это указатель, а размер poitner - это не длина содержимого, на которое он указывает.

Кроме того, я подозреваю, что вы делаете что-то еще неправильно, потому что это

char c = string[i]; 

неправильно, тип string[i]char * это не char.

Вы не опубликовали весь код, но это 2 ошибки в коде. Непонятно, почему вы передаете char ** функции, если вы не хотите изменять параметр.

+0

Это дает мне количество символов в строке, так что это определенно работает. – madcrazydrumma

+0

Это неправильно. Не противоречите более опытному программисту, если у вас нет доказательств того, что они ошибаются. Если это правильно, почему вы добавляете '1'? и какова длина строки? Можете ли вы его изменить? –

+0

Итак, как бы я правильно вычислил stringLength? – madcrazydrumma

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