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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> лишние символы, при printf(), ... 
:(
    Опции темы
gepard
  Дата 27.1.2005, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
char* chr = "hello my dear death...";
char* tmp = 0;

tmp = (char*)malloc(strlen(chr)*sizeof(char));
memcpy(tmp, chr, strlen(chr));
printf("%s\n", tmp);
free(tmp);
}

На экране:
Цитата

hello my dear death...****

Как "избавиться" от этих 4-ох звёздочек при выведении?



--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Unknown_Error
Дата 27.1.2005, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Перво, что приходит в голову, так это зачем выделять память?
Можно просто присвоить указатель:
Код

tmp = chr;

Цитата(gepard @ 27.1.2005, 05:35)
tmp = (char*)malloc(strlen(chr)*sizeof(char));

Кажется здесь надо так:
Код

tmp = (char*)malloc(strlen(chr)*sizeof(char) + 1);

Для завершающего символа 0!
PM MAIL ICQ   Вверх
chaos
Дата 27.1.2005, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



а через strcpy не проще будет?
PM WWW   Вверх
gepard
Дата 27.1.2005, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

tmp = chr;

Будет присвоена ссылка, а значит - после изменения chr измениться tmp.
Цитата

Для завершающего символа 0!

И как мне его воткнуть? Продемонстрируй.

Это сообщение отредактировал(а) gepard - 27.1.2005, 08:50


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
azesmcar
Дата 27.1.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
    char* chr = "hello my dear death...";
    char* tmp = 0;
    tmp = (char*) malloc(strlen(chr) * sizeof(char) + 1);
    memcpy(tmp, chr, strlen(chr) + 1);
    printf("%s\n", tmp);
    free(tmp);
}

В С каждая строка заканчивается завершающим символом, код - 0 или char '\0'
strlen возвращяет размер строки без завешающего символа, т.е. количество видимых символов...
когда освобождаешь память надо всегда на один символ больше и при копировании также..эсли это не strcpy а memcpy который не ведает что копирует, ему глубоко наплевать..просто берет эту часть памяти и копирует в другую...надо скопировать на один символ больше чтобы завершающий символ тоже скопировался...

PM   Вверх
Adil'
Дата 27.1.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если использовать sizeof(char), то тогда уж везде:
Код

...malloc((strlen(chr)+1) * sizeof(char));
memcpy(tmp, chr, (strlen(chr)+1) * sizeof(char));




--------------------
Удачи
PM MAIL WWW   Вверх
S.A.P.
Дата 27.1.2005, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(gepard @ 27.1.2005, 05:35)
char* chr = "hello my dear death...";
попробуй заменить на
Код

char chr[] = "hello my dear death...";

а дальше
Код

char* tmp = new char[strlen(chr)];
strcpy(tmp, chr);
printf("%s\n", tmp)



Добавлено @ 11:02
Мой код работает, проверил
PM MAIL   Вверх
val
Дата 27.1.2005, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


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

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



Вот, собственно моё решение...
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char chr[]= "hello my dear death...";
printf("%s\n", chr);
}


Всё работает...


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
azesmcar
Дата 27.1.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата
Вот, собственно моё решение...


Ну если уж на то пошло...тогда вот мое решение..smile
Код

#include <stdio.h>

void main()
{
  printf("hello my dear death...\n");
}


Немного критики, зачем тебе столько инклудов если ты их так и так не используешь??? smile
Ну может человеку просто понадобилось скопировать строку а не написать Hello World...smile
PM   Вверх
Gelert
Дата 27.1.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



При выделении памяти под tmp, как тебе уже посоветовали, выделяй на 1 байт больше а потом:
tmp[strlen(tmp)]=0;
printf("%s",tmp);
PM MAIL   Вверх
azesmcar
Дата 27.1.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата
При выделении памяти под tmp, как тебе уже посоветовали, выделяй на 1 байт больше а потом:
tmp[strlen(tmp)]=0;
printf("%s",tmp);


Зачем??? строку из которой копируешь уже содержит нулевой символ...просто надо скопировать на один символ больше...так ты лишний раз вызываешь strlen...

PM   Вверх
Adil'
Дата 27.1.2005, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Perchilla @ 27.1.2005, 10:56)
Код

char* tmp = new char[strlen(chr)];
strcpy(tmp, chr);
printf("%s\n", tmp)

Мой код работает, проверил

Perchilla, это просто повезло, что наступил в неиспользуемую память. В другой раз может и не повезти.



--------------------
Удачи
PM MAIL WWW   Вверх
gepard
Дата 28.1.2005, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот так должно быть... Всё правильно... Я просто нулвеой символ не так втыкал...
Код

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
char* chr = "hello my dear death...";
char* tmp = 0;

tmp = new char[strlen(chr)+1];
tmp[strlen(chr)] = 0;
strcpy(tmp, chr);
printf("%s\n", tmp);
delete [] tmp;
}



--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Adil'
Дата 28.1.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(gepard @ 28.1.2005, 05:49)
Вот так должно быть...
если strcmp(tmp,..., то tmp[strlen(chr)] = 0; - лишнее, strcmp сама 0-cимвол поставит...



--------------------
Удачи
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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