Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2011, 19:17   #1
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию Ерунда с заполнением строки

Есть кусок кода, который должен выводить двоичное представление введенного int-числа. Собственно, он его выводит, но, если N оставить 32, то после компиляции на стадии дебага Студия 2010 ругается на повреждение стека вокруг переменной binary выводом соответствующего окошка (рис. 1), но программа продолжает выполняться. Если при объявлении binary сделать [N+1], то мэссаджбокс не появляется, но в начале и в конце строки дописываются какие-то кракозябры. Собственно, кракозябры дописываются в любом случае, только во втором нет мэссаджбокса. Два вопроса:
1) Откуда берутся эти кракозябры и что с ними делать?
2) Почему ему не хватает 32-х позиций в массиве?

Код:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <windows.h>
#include <io.h>
#include <conio.h>
#include <fstream>
#define N 32

using namespace std;

void printbin(int x)
{
   char binary[N];
	for(int i = 0; i < N; ++i)
	{
		if (x & (1 << i) ) 
			binary[N-i] = '1'; 
		else 
			binary[N-i] = '0';
	}
	cout << binary;
}

int main()
{
	int bitmap = 64;
	printbin(bitmap);
	_getch();
	return 0;
}
Спасибо, жду ответа.
RAZOR1703 вне форума Ответить с цитированием
Старый 25.11.2011, 19:26   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
binary[N-i-1]
ну и 33-й символ должен быть \0, это понятно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.11.2011, 20:01   #3
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

veniside
Протормозил, каюсь.
Ну а с абракадаброй что?
RAZOR1703 вне форума Ответить с цитированием
Старый 25.11.2011, 23:36   #4
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Ну же, друзья, на помощь.
Я до сих пор не понял.
RAZOR1703 вне форума Ответить с цитированием
Старый 26.11.2011, 01:52   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

че ж непонятного, вроде всё уже рассказал:

Код:
#define N 32

void printbin(int x)
{
	char binary[N + 1];
	binary[N] = '\0';
	//
	for (int i = 0; i < N; ++i)
	{
		if (x & (1 << i)) 
			binary[N - i - 1] = '1'; 
		else 
			binary[N - i - 1] = '0';
	}
	std::cout << binary;
}
и никакой "абракадабры".
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.11.2011, 15:53   #6
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Спасибо большое, так работает. Только я вот со строками редко встречался. Объясните пожалуйста, с чем это связано? \0, насколько я понимаю, это конец строки. А что происходит здесь?
Код:
binary[N] = '\0';
RAZOR1703 вне форума Ответить с цитированием
Старый 26.11.2011, 16:17   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

да, \0 — это признак конца строки, если о нём не позаботиться, будет выводится любой мусор за строкой, пока случайно не встретится 0.

> А что происходит здесь

здесь мы заносим в конец строки (в 33-й символ) признак конца строки. Остальные 32 символа заполняются '1' и '0'.

Правило простое: если строка должна содержать N символов, то выделяется память под N + 1 символов, и в последний заносится \0.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.11.2011, 16:33   #8
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Всё понял, спасибо еще раз.
RAZOR1703 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Опять ерунда с авторизацией!!! Русtam PHP 9 01.08.2011 01:19
проблема с заполнением массива Freddi Krjuger Общие вопросы C/C++ 0 22.10.2010 18:12
Virtual Box и непонятная ерунда. jojahti Операционные системы общие вопросы 1 09.10.2009 00:06
Проблема с заполнением asd48 Помощь студентам 1 21.04.2009 00:21