| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > В строку лезут левые символы. |
| Автор: btrfly 18.5.2008, 17:30 | ||||
| Если ошибся разделом,то извините Есть строка в кодировке windows-1251. Если важно,откуда она берется,то: Получаю строку с сервера http://mrim.mail.ru:2042 через сокеты. Строка- ip:port в текстовом формате. Например: 194.186.55.17:2041 Так вот. В конец строки лезут всякие левые символы,которых там быть не должно. Ноль в конце строки не помогает,точнее помогает,но не совсем. Если например строка-
то все места(не знаю как правильно назвать)свободные от строки заполняются всякой ахинеей. Ну всмысле, 194.186.55.17:2041 занимает 19 символов,остальные 105 будут вида ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠░╕↓. Сиволов 116,вместо 105 ожидаемых Если в конец строки поставить '\0',то в консоли все будет нормально отображаться, но если сделать так:
то в самом окне будет нормально отображаться,а в заголовке сообщения в конце строки будет один квадратик Как сделать,чтобы все нормально было? |
| Автор: bsa 18.5.2008, 17:58 |
| Попробуй просто с отладчике посмотреть, что за символы в конце строки. Скорее всего, там символ конца строки ('\n'), который тебе надо было просто заменить на '\0'. |
| Автор: rrrFer 18.5.2008, 18:05 |
| у меня летом что то похожее было, попробуй не использовать массив вообще - читай все 124 символа в одну символьную переменную, странно, но у меня работало, и проблема с messagebox тоже пропала... |
| Автор: bsa 18.5.2008, 18:45 | ||
btrfly, по поводу 18 и 19. Тебе сервер присылает данные объемом 19 байт. В их число входит символ конца строки ('\n'). Тебе он не нужен, поэтому для тебя полезный объем - 18 байт. Значит по индексу "количество байт в строке" (почему так? напиши ряд цифр от 0 до 9 и посчитай их количество) тебе нужно прописать символ '\0'.
|
| Автор: rrrFer 18.5.2008, 18:47 | ||||
вот мы всей группой думали, но оно работает...му так и не поняли почему
ну да читали AnsiNext и AnsiPrev, однако, все равно не понятно как оно хранится, прдположение есть что записывается 1 символ, и к нему есть доступ, и ОС запрещает доступ к нему другим приложениям, а остальные символы записываются однако к рессурсам данного приложения не относятся, т.е любое приложение может их перезаписать или прочитать, не хорошо... |
| Автор: btrfly 18.5.2008, 19:33 |
| bsa, Я когда считал,сколько символов в строке 194.186.55.17:2041,у меня всегда получалось 19 Этот ноль никак не будет мешать,когда я разделю строку с помощью strtok() на айпи и порт,и буду использовать значения для коннекта? И еще.Для сервера,строка это- строка в кодировке windows-1251 без завершающего нуля. Это надо будет каждый раз при приеме/отправке присоединять\отрезать этот ноль? Маленько не по теме: Так как пишу все на wxWidgets(учусь по-крайней мере), сборка юникод.При конвертации в win-1251 и обратно никаких проблем не будет возникать по поводу этого нуля? |
| Автор: bsa 18.5.2008, 19:51 |
| btrfly, почитай пожалуйста учебники по Си. В частности, про строки и способ их хранения в памяти. Там есть все ответы. От себя могу сказать, что '\0' - это символ конца строки в программе (т.е. все функции работают со строками пока не встретят его), а '\n' символ конца строки в многострочном тексте (т.е. он означает, что следующие за ним символы нужно отображать на новой строке), в т.ч. и в файлах. |
| Автор: btrfly 18.5.2008, 20:17 |
| Все,понял,пошел читать |