Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильное значение 
:(
    Опции темы
SneG0K
Дата 7.5.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: нет
Всего: 54



Код

#include "stdafx.h"
#include "stdio.h"
#include "iostream"


int _tmain(int argc, _TCHAR* argv[])
{
    char *str = new char[64];
    int i = 0;
    while (i < 63) {
        i += 1;
        str[i] = (char) 's';
    }
    std::cout << str;
    return 0;
}

Ставлю брякпоинт на ретурн, смотрю значение str, а там первый символ h, потом куча s, а потом штук десять вообще каких-то непонятных...
в чем ошибка?

Добавлено через 2 минуты и 43 секунды
Ну код подправлю, вопрос не в этом,
почему в строке str, после создания полно символов H?

Добавлено через 4 минуты и 28 секунд
Еще, как узнать размер массива?
PM WWW Skype   Вверх
math64
Дата 7.5.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



1. Не заполняешь первый элемент массива i += 1; ДО str[i] = (char) 's';
2. Не добавляешь 0 в конец строки
PM   Вверх
Alca
Дата 7.5.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Цитата

Еще, как узнать размер массива?

Никак

Добавлено @ 15:55
Цитата

почему в строке str, после создания полно символов H?

На консоль нормально выводит?

Это сообщение отредактировал(а) Alca - 7.5.2009, 15:57


--------------------
PM WWW ICQ Skype Jabber   Вверх
SneG0K
Дата 7.5.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: нет
Всего: 54



Код

#include "stdafx.h"
#include "stdio.h"
#include "iostream"
int _tmain(int argc, _TCHAR* argv[])
{
    char *str = new char[64];
    int i = 0;
    while (i < 63) {  
        str[i] = (char) 's';
        i += 1;
    }
    str[64] = '\0';
    std::cout << str;
    return 0;
}

Немножко подредактировал... Но в конце строки есть знак равно ( = )
PM WWW Skype   Вверх
mrbrooks
Дата 7.5.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Цитата(Alca @  7.5.2009,  15:54 Найти цитируемый пост)
Никак

и даже strlen не поможет?  чай все таки строка.
PM MAIL   Вверх
Lazin
Дата 7.5.2009, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(SneG0K @  7.5.2009,  16:16 Найти цитируемый пост)
str[64] = '\0';

выход за границу массива, макс. индекс - 63, так как нумерация начинается с нуля
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 7.5.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



SneG0K

1. Выделил память - удаляй (в конце delete [] str)
2. i += 1 (++i выглядет немного лучше smile )
3. str[64] = '\0'; - такого индекса нет, выделено 64 элемента, последний 63 так как в С/С++ индексы начинаются с нуля.

Добавлено через 1 минуту и 3 секунды
что-то вроде этого smile

Код

#include "stdafx.h"
#include "stdio.h"
#include "iostream"

int _tmain(int argc, _TCHAR* argv[])
{
    char *str = new char[64];
    for (int i = 0; i < 63; ++i)
    {
        str[i] = (char) 's';
    }
    str[63] = '\0';
    
    std::cout << str;
    delete [] str;

    return 0;
}

PM   Вверх
Soah
Дата 7.5.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 6
Всего: 54



SneG0K, в C++ индексы начинаются с нуля

Код

str[63] = '\0';

Код

str[i] = '\0';



Цитата(SneG0K @  7.5.2009,  15:34 Найти цитируемый пост)
Еще, как узнать размер массива?

http://forum.vingrad.ru/index.php?showtopi...t&p=1831345

Это сообщение отредактировал(а) Soah - 7.5.2009, 16:22
PM MAIL   Вверх
Alca
Дата 7.5.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Цитата

и даже strlen не поможет?  чай все таки строка.

Тока для сишной строки
Я имел ввиду, что сразу после 
Код

char *str = new char[64];

длину строки определить низя.




Это сообщение отредактировал(а) Alca - 7.5.2009, 16:25


--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 7.5.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Lazin опередил smile
PM   Вверх
mrbrooks
Дата 7.5.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



SneG0K, в С/С++ массивы строго начинаются с нуля. поэтому последний элемент в твоем массиве будет str[63]. Собственно код 
Код

str[64] = '\0';

не верен. 

надо так:
Код

str[63] = '\0';


Добавлено через 54 секунды
гы. припозднился.

Добавлено через 3 минуты и 16 секунд
Цитата(Alca @  7.5.2009,  16:22 Найти цитируемый пост)
Тока для сишной строки

дык речь и идет про массив символов.
PM MAIL   Вверх
SneG0K
Дата 7.5.2009, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: нет
Всего: 54



Аааа, все понял... Я думал, что резервируется только последняя ячейка массива, я не знал про первую..
То есть формально из 64 элементов мне доступно 62?
PM WWW Skype   Вверх
Alca
Дата 7.5.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



63 и +1 под '\0' (если это сишная строка) = 64 (64 - это размер массива)

Добавлено через 4 минуты и 54 секунды
Если массив символов до доступно все 64

Это сообщение отредактировал(а) Alca - 7.5.2009, 17:56


--------------------
PM WWW ICQ Skype Jabber   Вверх
SneG0K
Дата 7.5.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: нет
Всего: 54



Код

#include "stdafx.h"
#include "stdio.h"
#include "iostream"
int _tmain(int argc, _TCHAR* argv[])
{
    char *str = new char[64];
    int i = 0;
    while (i < 63) {  
        str[i] = (char) 's';
        i += 1;
    }
    str[63] = '\0';
    std::cout << str;
    return 0;
}


Ну теперь все работаетsmile Всем спасибо
PM WWW Skype   Вверх
Alca
Дата 7.5.2009, 18:07 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Чтоб не путаться лучше писать так:
Код

#include "stdafx.h"
#include "stdio.h"
#include "iostream"
int _tmain(int argc, _TCHAR* argv[])
{
    const int ciStrSize = 63;
    char *str = new char[ciStrSize + 1];    //один сивол резервируем для нуля
    int i = 0;
    while (i < ciStrSize) {  
        str[i] = (char) 's';
        i += 1;
    }
    str[ciStrSize] = '\0';
    std::cout << str;
    
    return 0;
}


Это сообщение отредактировал(а) Alca - 7.5.2009, 18:11


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1307 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.