Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 17:09   #1
Ksardas13
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 120
Печаль Странная проблема со строками(подробности внутри)

Сори, за странное название темы, другого придумать не смог(((

Есть такой вот код(убрал всё лишнее):
Цитата:
void logging(char *text) //процедура вывода на экран строки
{std::cout<<text;} //проста до неприличия

... //ниже текст программы
char *s;
s="12345678910";
logging("\n"); logging(s);logging("\n");

int i=5;
char s2[i];
for (int j=0;j<i;j++) {s2[j]=s[j];
logging("\n");logging(s2);logging(" \n");}
logging("\n\n"); logging(s2);logging("\n");
...//уровень детского сада для умственно отсталых -_-
Что получаем на экране:

Цитата:
12345678910

1Aжv?@

12жv?@

123v?@

1234?@

12345@


12345@
АААААА!!!! Откуда эти два лишних символа в конце строки?!?!?! О_О
Причём прикол ещё в том, что если написать вот так(т.е. просто вывод на экран сделать не отдельной процедурой, а сразу выводить... см.ниже):

Цитата:
...
char *s;
s="12345678910";
std::cout<<"\n";std::cout<<s;std::c out<<"\n";

int i=5;
char s2[i];
for (int j=0;j<i;j++) {s2[j]=s[j];
std::cout<<"\n\n"; std::cout<<s2;std::cout<<"\n";}
std::cout<<"\n\n"; std::cout<<s2;std::cout<<"\n";
...
Всё выводиться на экран нормально! Всё как надо!

Вопрос - что не так? Ошибка в передаче строки в процедуру вывода?
Ksardas13 вне форума Ответить с цитированием
Старый 24.03.2011, 17:26   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Нет, ошибка в том, что нет завершающего нуля в конце строки. Можете сделать так:
Код:
char s2[i + 1] = { 0 }; // Инициализация всего массива нулём
Должно нормально выводить. Только следует учитывать, что массивы переменной длины в C++ - это расширение компилятора и может не скомпилироваться на других компиляторах.
netrino вне форума Ответить с цитированием
Старый 24.03.2011, 17:42   #3
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

лучше int i=strlen(s)+1; или типа того
onewho вне форума Ответить с цитированием
Старый 24.03.2011, 18:38   #4
Ksardas13
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 120
По умолчанию

netrino, на строчку "char s2[i + 1] = { 0 };" компилятор ругается(пишу в Dev-Cpp) ;( :
Цитата:
variable-sized object `s2' may not be initialized
Пока гуглю ответ.
*Ответ найден экспериментально - если написать "char s2[6] = { 0 };" всё пашет, если "char s2[i + 1] = { 0 };" нет. Я в печали. Что делать?
*Пока продолжаю эксперименты. Но всё таки что делать если бы было необходимо именно задать размер массива через i?

onewho, цель взять именно 5 символов(а не все) из строки S и создать из них строку S2.))

Последний раз редактировалось Ksardas13; 24.03.2011 в 18:47. Причина: *Дополнено
Ksardas13 вне форума Ответить с цитированием
Старый 24.03.2011, 19:15   #5
Ksardas13
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 120
По умолчанию

Вообщем, задачу поставленную перед собой решил. Спасибо netrino.)
Мучаюсь с приложениями сервер-клиент. Там всёравно стоит огранчиение на перекидываемые между сервером и клиентом строки, так что строчка "char s2[4096 + 1] = { 0 };" спасла мои нервы и мозг.))
Ksardas13 вне форума Ответить с цитированием
Старый 24.03.2011, 20:19   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Ksardas13 Посмотреть сообщение
netrino, на строчку "char s2[i + 1] = { 0 };" компилятор ругается(пишу в Dev-Cpp) ;( :
Подозревал что так будет, но лень было проверять )
Заполнить массив нулями можно также пройдясь по нему в цикле:
Код:
for (int j = 0; j < i + 1; j++)
   s2[j] = 0;
Или воспользовавшись функцией memset
netrino вне форума Ответить с цитированием
Старый 24.03.2011, 20:27   #7
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
int i=5;
char s2[i];
Размер массива должен быть константой. В Си такое еще можно (я про выше приведенный код), но в С++ нет.

Последний раз редактировалось profi; 24.03.2011 в 20:39.
profi вне форума Ответить с цитированием
Старый 24.03.2011, 22:29   #8
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

так в конце кода надож было добавить s2[j]=0; вродь, и всё? (ну и размер строки разумеется 6)
onewho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацените программу. Your Assistant. Подробности внутри. Casper-SC Софт 24 30.07.2012 11:49
как реализовать смещение в richedit'e?подробности внутри nuevegramodelamor Помощь студентам 11 28.05.2010 13:33
Посмотрите ошибки функции ...подробности внутри NopeR Общие вопросы C/C++ 2 19.01.2010 18:46
Пара задачек по Паскалю подробности внутри-> Nexx Помощь студентам 6 03.10.2007 09:08