Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Функции strlen и lstrlen обрезают количесво символов в строке  (Прочитано 14008 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« : 14-11-2010 09:30 » 

Мой код:
Код:
#include <windows.h>
#include <iostream.h>
#include <string.h>
#include <conio.h>

int main(void)
{
char *str = "Введите строку: ";
// Указатель на исходную строку
char *s = "\0";

  CharToOem(str, str);

  cout << str << endl;
  cin >> s;
  cout << strlen(s) << endl; // В место strlen может быть lstrlen
 
  getch();
  return 0;
}

Если я ввожу:
23
то всё нормально, длина равна 2
Если я ввожу:
2 3
то длина обрезается и равна 1, а должна быть равна 3

Какую же мне тогда использовать функцию для подсчёта количества символов в строке?
А может виноват мой компилятор. У меня компилятор C++ Builder 5.5
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-11-2010 09:43 » 

Начнём с того, что куда считывается строка? Здесь нет нормального выделения памяти под строки: память выделяется только под строковые константы. Поэтому, в зависимости от компилятора, дальше может происходить что угодно, вплоть до падения программы из-за попытки записать в read-only блок.

Далее. Идём и читаем про оператор >>, а именно:
str
    Extracts characters and stores them as a c-string (i.e. in succesive locations starting at location pointed by str and terminated by a null-character). Extraction ends when the next character is either a valid whitespace or a null character, or if the End-Of-File is reached.
    The terminating null character is automatically appended after the extracted characters.
Таким образом, даже если всё сработает правильно, оператор читает строку до первого пробела.

Если надо прочитать строку - у потоков есть функция getline.
« Последнее редактирование: 14-11-2010 09:49 от Вад » Записан
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #2 : 14-11-2010 10:00 » 

Вад, большое спасибо.

Я заменил
Код:
cin >> s;
на
Код:
cin.getline(s, 100);

И всё стало нормально определятся. Я поставил 100 так как я врятли буду вводить больше, а если что то getline обрежет, то что будет выходить за пределы.
« Последнее редактирование: 14-11-2010 10:19 от zuze » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 15-11-2010 03:37 » 

zuze, ты память под s выделил или так и оставил один байт и не определённое поведение в подарок?
Записан

Странно всё это....
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #4 : 15-11-2010 17:43 » 

Антон (LogRus), конечно выделил, сделал так
Код:
char s[100] = "\0";
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 15-11-2010 18:05 » 

а почему не std::string?
Записан

Странно всё это....
zuze
Опытный

ru
Offline Offline
Пол: Мужской
Россия, Москва


« Ответ #6 : 16-11-2010 00:21 » 

Антон (LogRus), у меня слишком простая задача, в таком случае я могу обойтись без него, но если нужно будет выигрыш в быстродействии, то я конечно воспользуюсь std::string.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 16-11-2010 04:18 » new

ну тут вопрос не в быстро действии, а в удобсте использования
я стараюсь избегать данных в C стиле, до тех пор пока не будет доказано, что средства STL меня не устраивают
кроме того работая с char * ты вынужден использовать srtlen для определения длинны, а это не сильно быстрая операция сложности O(N), а string::size() имеет сложность O(1)
+ не надо заботится о размере буфера
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines