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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление вручную признака конца строки 
:(
    Опции темы
JTut
Дата 13.10.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такая запись, как я понял, вызывает глюки
s[i]='\0';
Как тогда его добавить?
PM MAIL   Вверх
DjoNIK
Дата 13.10.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Такая запись вызывает глюки когда ты пытаешься записать элемент по недоступному индексу.
Какой у тебя глюк был?
Цитата(JTut @  13.10.2008,  12:29 Найти цитируемый пост)
Как тогда его добавить? 

можно еще 
Код

*(s+i) = '\0';

Но это считай тоже самое


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
JTut
Дата 13.10.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Определили строку s2
Нужно скопировать все символы из строки s2 в строку s3 (Это упрощенный вариант моей задачи)

char* s3;
    for (int i=0; i<=strlen(s2); i++)
    {
        if (s2[i]=='\0')
        {
            s3 = new char[i+1];
            for(int k=0; k<i;k++)    
            {
                s3[k]=s2[k];
            }
            s3[k+1] = '\0';
            printf(s3);
        }
    }

Если я ввожу слово Привет, то он пишет Привет=
Если я выделяю память под массив стандартным образом, то есть char s3[20], то он дописывает к концу строки вообще непонятный символ

Кстати, ваш вариант не помог

Это сообщение отредактировал(а) JTut - 13.10.2008, 12:55
PM MAIL   Вверх
mrbrooks
Дата 13.10.2008, 12:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



JTut,  а strcpy() использовать запрещают религиозные убеждения?
PM MAIL   Вверх
mes
Дата 13.10.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(JTut @  13.10.2008,  12:54 Найти цитируемый пост)
Это упрощенный вариант моей задачи

намутили Вы с решением

Код

int str_length  (const char *p) { int i=0; while (*(p++)) ++i;  return i; }
void str_copy (const char *src, char* dest) { while (*(dest++)=*(src++)); dest ='\0'; }

..
const char* s1  = "Hallo";
char * s2;

s2 = new char(str_length(s1)+1);  // +1 для \0
str_copy (s1,s2);



Это сообщение отредактировал(а) mes - 13.10.2008, 13:06


--------------------
PM MAIL WWW   Вверх
JTut
Дата 13.10.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В том  то и дело, что мне по заданию нужно сделать без этих копи.
я пытаюсь вручную сделать.
Но я понял

for(int k=0; k<i;k++)    
            {
                s3[k]=s2[k];
            }
            s3[k+1] = '\0'; Тут нужно было дописать s3[k]='\0' , так как k на выходе из цикла будет на 1 больше, то есть равно i. Это я по коду copy понял.
Все, всем спасибо. 


PM MAIL   Вверх
mes
Дата 13.10.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(JTut @  13.10.2008,  12:54 Найти цитируемый пост)
       for (int i=0; i<=strlen(s2); i++)...            s3 = new char[i+1];

обратите также внимание и на цикличное выделение памяти   smile 


--------------------
PM MAIL WWW   Вверх
JTut
Дата 13.10.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, кстати, спасибо, что напомнили.
Если вот так в цикле постоянно выделять память, то она будет увеличиваться ли просто перезаписываться?
Просто мне не удалось ее очистить с помощью функции delete []
PM MAIL   Вверх
DjoNIK
Дата 13.10.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Таким образом ты будешь постоянно резервировать новые области из кучи.
Почему не удалось использовать delete []?
Код покажи.

Это сообщение отредактировал(а) DjoNIK - 13.10.2008, 13:53


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
JTut
Дата 13.10.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все удалось, надо было так написать
delete [] S;
PM MAIL   Вверх
mes
Дата 13.10.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(JTut @  13.10.2008,  19:49 Найти цитируемый пост)
Все удалось, 

надеюсь операцию выделения памяти Вы все таки вынесли из цикла )


--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 14.10.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
 
main()
{
    //Нужно скопировать все символы из строки s2 в строку s3
    
    char line[] = "something", *p;
    int i, j;
    
    if ((p = (char *) malloc(strlen(line)+1)) == NULL)
        return 1;
    for (i = j = 0; p[i++] = line[j++]; )
        ;
    printf("%s", p);
    putchar('\n');
    free(p);
    return 0;
}




ты написал

Код
 printf(s3); 

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




Это сообщение отредактировал(а) inside_pointer - 14.10.2008, 10:34
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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