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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В строку лезут левые символы. 
V
    Опции темы
btrfly
Дата 18.5.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если ошибся разделом,то извините smile 
Есть строка в кодировке windows-1251.
Если важно,откуда она берется,то:
Получаю строку с сервера http://mrim.mail.ru:2042 через сокеты.
Строка- ip:port в текстовом формате.
Например: 194.186.55.17:2041

Так вот.
В конец строки лезут всякие левые символы,которых там быть не должно.
Ноль в конце строки не помогает,точнее помогает,но не совсем.
Если например строка-
Код

char ipAddr[124];

то все места(не знаю как правильно назвать)свободные от строки заполняются всякой ахинеей.
Ну всмысле, 194.186.55.17:2041 занимает 19 символов,остальные 105 будут вида ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░╕↓
.
Сиволов 116,вместо 105 ожидаемых smile 
Если в конец строки поставить '\0',то в консоли все будет нормально отображаться,
но если сделать так:
Код

MessageBoxA(0,ipAddr,ipAdrr,0);

то в самом окне будет нормально отображаться,а в заголовке сообщения в конце строки будет один квадратик smile 

Как сделать,чтобы все нормально было? smile 
PM MAIL   Вверх
bsa
Дата 18.5.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Попробуй просто с отладчике посмотреть, что за символы в конце строки. Скорее всего, там символ конца строки ('\n'), который тебе надо было просто заменить на '\0'.
PM   Вверх
rrrFer
Дата 18.5.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



у меня летом что то похожее было, попробуй не использовать массив вообще - читай все 124 символа в одну символьную переменную, странно, но у меня работало, и проблема с messagebox тоже пропала...
PM MAIL WWW ICQ   Вверх
btrfly
Дата 18.5.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bsa @  18.5.2008,  18:58 Найти цитируемый пост)
Попробуй просто с отладчике посмотреть, что за символы в конце строки. Скорее всего, там символ конца строки ('\n'), который тебе надо было просто заменить на '\0'. 

С отладчиком не дружу,поэтому вручную нашел:
Код

for(int i=0;ipAddr[i];i++)
    if(ipAddr[i]=='\n')
    {
        printf("Позиция: %d\n",i);
        ipAddr[i]='\0';
    }

Символ есть smile 
Только-Позиция:18.
Почему 18,если строка занимает 19 символов,соответственно ipAddr[18]-последняя цифра порта,
а там оказывается символ конца строки?

зы.
 smile 
спс,все заработало.Только у меня еще пару вопросов будет попозже smile 


Цитата(rrrFer @  18.5.2008,  19:05 Найти цитируемый пост)
попробуй не использовать массив вообще - читай все 124 символа в одну символьную переменную

эээ...
как в одну переменную размером один байт запехать 19 байт smile 

Это сообщение отредактировал(а) btrfly - 18.5.2008, 18:27
PM MAIL   Вверх
bsa
Дата 18.5.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



btrfly, по поводу 18 и 19. Тебе сервер присылает данные объемом 19 байт. В их число входит символ конца строки ('\n'). Тебе он не нужен, поэтому для тебя полезный объем - 18 байт. Значит по индексу "количество байт в строке" (почему так? напиши ряд цифр от 0 до 9 и посчитай их количество) тебе нужно прописать символ '\0'.
Цитата
как в одну переменную размером один байт запехать 19 байт
очень просто - читать поочереди. Но в твоем случае это не подходит, поэтому просто игнорируй.
PM   Вверх
rrrFer
Дата 18.5.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

как в одну переменную размером один байт запехать 19 байт  

вот мы всей группой думали, но оно работает...му так и не поняли почему
Цитата

очень просто - читать поочереди

ну да читали  AnsiNext и  AnsiPrev, однако, все равно не понятно как оно хранится, прдположение есть что записывается 1 символ, и к нему есть доступ, и ОС запрещает доступ к нему другим приложениям, а остальные символы записываются однако к рессурсам данного приложения не относятся, т.е любое приложение может их перезаписать или прочитать, не хорошо...



Это сообщение отредактировал(а) rrrFer - 18.5.2008, 19:00
PM MAIL WWW ICQ   Вверх
btrfly
Дата 18.5.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bsa
Я когда считал,сколько символов в строке 194.186.55.17:2041,у меня всегда получалось 19 smile 
Этот ноль никак не будет мешать,когда я разделю строку с помощью strtok() на айпи и порт,и буду использовать значения для коннекта?
И еще.Для сервера,строка это-
строка в кодировке windows-1251 без завершающего нуля.
Это надо будет каждый раз при приеме/отправке присоединять\отрезать этот ноль?

Маленько не по теме:
Так как пишу все на wxWidgets(учусь по-крайней мере),
сборка юникод.При конвертации в win-1251 и обратно никаких проблем не будет возникать по поводу этого нуля? smile 
PM MAIL   Вверх
bsa
Дата 18.5.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



btrfly, почитай пожалуйста учебники по Си. В частности, про строки и способ их хранения в памяти. Там есть все ответы.
От себя могу сказать, что '\0' - это символ конца строки в программе (т.е. все функции работают со строками пока не встретят его), а '\n' символ конца строки в многострочном тексте (т.е. он означает, что следующие за ним символы нужно отображать на новой строке), в т.ч. и в файлах.
PM   Вверх
btrfly
Дата 18.5.2008, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все,понял,пошел читать smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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