Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Добавление вручную признака конца строки


Автор: JTut 13.10.2008, 12:29
Такая запись, как я понял, вызывает глюки
s[i]='\0';
Как тогда его добавить?

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

можно еще 
Код

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

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

Автор: JTut 13.10.2008, 12:54
Определили строку 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], то он дописывает к концу строки вообще непонятный символ

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

Автор: mrbrooks 13.10.2008, 12:56
JTut,  а strcpy() использовать запрещают религиозные убеждения?

Автор: mes 13.10.2008, 13:05
Цитата(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);


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

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


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

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

Автор: JTut 13.10.2008, 13:48
Да, кстати, спасибо, что напомнили.
Если вот так в цикле постоянно выделять память, то она будет увеличиваться ли просто перезаписываться?
Просто мне не удалось ее очистить с помощью функции delete []

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

Автор: JTut 13.10.2008, 19:49
Все удалось, надо было так написать
delete [] S;

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

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

Автор: inside_pointer 14.10.2008, 10:22
Код

#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, а там память



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)