Форум программистов, компьютерный форум CyberForum.ru

странное поведение указателя - C++

Восстановить пароль Регистрация
 
AnreyKazakov
Заблокирован
12.09.2012, 00:13     странное поведение указателя #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cstring>
int main(){
    char line1[]="hello world!"; 
    char line2[]="hell word!";
    int len=strlen(line1)+strlen(line2)+1;
    char* line3=new char[len];
    strcat(line3,line1);strcat(line3,line2);
    for(char* q=line3;q!=line3+len;++q){std::cout<<*q;} //может он косячит
    std::cout<<std::endl;                             //только не пойму как
    return 0;
    }
В общем, выводит как будто бы не с нулевого значения а с -2, потому что сначала два символа выходят, потом кусок текста (нужный), но двух символов до конца не хватает, съедаются... получается вот так: **hello world!hell wor
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2012, 00:13     странное поведение указателя
Посмотрите здесь:

C++ Странное поведение
Странное поведение new C++
C++ Станное поведение указателя
Странное поведение cin C++
Странное поведение функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 00:19     странное поведение указателя #2
Когда ты делаешь new char[len] тебе выдается неинициализированный блок памяти. Нельзя сразу делать strcat т.к. он опирается на конец строки в line3, а там нет строки=). нужно первый strcat заменить на strcpy
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
12.09.2012, 00:22     странное поведение указателя #3
C
1
2
    char* line3=new char[len];
    strcat(line3,line1);strcat(line3,line2);
В line3 есть мусор. Можете проверить, напечатав эту строку на экран, после выделения ей памяти.
Перед тем как работать с буфером, почистите его
C
1
memset (line3, 0, len);
Добавлено через 48 секунд
Цитата Сообщение от PSIAlt Посмотреть сообщение
нужно первый strcat заменить на strcpy
Необязательно
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 00:26     странное поведение указателя #4
И ежу понятно что не обязательно.
Необязательно и memset делать. И вообще sizeof(line3) выдает совсем не то что ты думал=)
Elboy
131 / 112 / 4
Регистрация: 01.09.2012
Сообщений: 288
12.09.2012, 00:26     странное поведение указателя #5
Цитата Сообщение от PSIAlt Посмотреть сообщение
а там нет строки
строка там есть,но хз что в ней
AnreyKazakov
Заблокирован
12.09.2012, 08:44  [ТС]     странное поведение указателя #6
Цитата Сообщение от Elboy Посмотреть сообщение
memset (line3, 0, len);
не знаю я как этим пользоваться, сделал strcpy, все заработало на ура, дейсвительно мусор был, вот посмотрел =)
C++
1
2
3
4
5
6
7
#include <iostream>
int main(){
    char* line3 = new char[10];
    for(char* q = line3;q!=line3+9;++q){std::cout<<*q;}
    std::cout<<std::endl;
    return 0;
    }
выводит какие-то смайлики блин вместо пустой строки....
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 10:33     странное поведение указателя #7
Строки char* кончаются когда встречается символ с кодом 0. Когда ты выделяешь память (new, malloc) - выданная память не инициализирована. То есть в ней может находится что угодно, обычно это остатки от предыдущих приложений или остатки твоих собственных обьектов (которые ты удалил ранее). Так вот, если нужно просто создать пустую строку делай так:
C++
1
2
3
4
char * line3 = new char[30];
line3[0] = 0; // Ставим знак окончания строки прямо в начале
// ...
delete []line3;
Получается в line3 лежит последовательность в которой первый же символ идет с кодом 0. Соответвенно strlen(line3) будет == 0, что мы обчно и называем "пустой строкой"
З.Ы. Не забывай delete[] для обьектов которым ты делал new[]. В данном случае (прога почти сразу выходит) - пофигу, но вообще так оставлять нельзя.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2012, 11:05     странное поведение указателя
Еще ссылки по теме:

Странное поведение указателя C++
Странное поведение присваивания C++
C++ Странное поведение программы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AnreyKazakov
Заблокирован
12.09.2012, 11:05  [ТС]     странное поведение указателя #8
Цитата Сообщение от PSIAlt Посмотреть сообщение
line3[0] = 0; // Ставим знак окончания строки прямо в начале
Вот это я даже не знал, я так понимаю line3[0]=0; равноправно записи line3[0]='\0'; а про delete[] я забыл
Yandex
Объявления
12.09.2012, 11:05     странное поведение указателя
Ответ Создать тему
Опции темы

Текущее время: 03:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru