#c #string #off-by-one
#c #строка #по одному
Вопрос:
Я хочу сохранить двоичное значение каждого символа в строке и сохранить его в массиве. Но когда я начинаю возиться с такими функциями, как memset
, у меня нет контроля над отладкой.
#include <stdio.h>
#include <string.h>
int main()
{
char str[8];
char *ptr = "Hello";
int i;
for(; *ptr != 0; ptr)
{
printf("%c => ", *ptr);
/* perform bitwise AND for every bit of the character */
for(i = 7; i >= 0; --i)
if(*ptr amp; 1 << i)
str[7-i]='1';
else
str[7-i]='0';
//(*ptr amp; 1 << i) ? putchar('1') : putchar('0');
str[8]='';
printf("%sn",str);
memset(str,'/0',8);
}
return 0;
}
Вывод:
H => 01001000
e => 01100101
l => 01101100
l => 01101100
o => 01101111
Abort trap
Было бы неплохо, если бы кто-нибудь мог пролить некоторый свет. Несмотря на то, что я получаю выходные данные, происходит прерывание.
Любезно предоставлено: Это модифицированная программа другого пользователя stack @Athabaska.
Ответ №1:
str[8]=''
вызывает переполнение буфера, потому что str
содержит только 8 элементов, и вы пытаетесь получить доступ к девятому.
Редактировать: я жаловался на '/0'
, но, как сообщил мне @R .., он является допустимым — однако memset()
в конечном итоге преобразует свой параметр в unsigned char
, поэтому я не думаю, что есть какой-либо смысл в его использовании, поэтому я предполагаю, что автор захочет изменить его на ''
.
Комментарии:
1.
'/0'
допустимо C. Это многосимвольная константа, которая имеет значение, определенное реализацией, обычно определяемое как интерпретация байтов в этом порядке как число с собственным порядком окончания.2. @R..: 1; Я этого не знал. Однако не вижу смысла передавать многосимвольное значение функции, которая в конечном итоге преобразует свой параметр в ‘unsigned char’…
3. Ну, в типичных реализациях он будет заполняться либо
'/'
, либо'0'
в зависимости от порядкового номера системы. 🙂
Ответ №2:
str[8]='';
недопустимо. Если объявление является char str[8];
, то допустимые индексы являются 0..7
Ответ №3:
в str[] есть место только для 8 символов, но вы получаете доступ к 9-му: str[8] = '';