Строки String в Borland C++ 3.1 для начинающих

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Строки в Borland C++ 3.1 как таковые отсутствуют. Для их обработки программисты часто используют указатель и символьные переменные. Для многих начинающих перспектива работы с указателями может казаться неудобным примером для обучения и приводить к некоторому дискомфорту. На самом деле любая строка представляет собой одномерный массив символов с некоторыми особенностями

Строка представляет собой одномерный массив, но в отличии от массива первый элемент нужно воспринимать как первый, а последний элемент является признаком окончания строки.

  • В C++ 3.1 проблема в том, что символьная переменная равнозначна объявлению константы и поменять её компилятор не даст. Вот поэтому приходится прибегать к помощи указателей

Вообще если честно мне этот материал доставил массу настоящих неудобств. Неудобно прежде всего искать действительно ценную информацию по теме, а не кусок недокода
На многих сайтах приблизительно такое:
Код C++

Казалось бы так просто. Но в этом коде есть минус, причем этот минус способен довести начинающих до бешенства. Если попытаться считать в переменную строчку, которую предположительно надо обработать, то тут-то и начинаются проблемы. С вашего позволения я не буду описывать эти проблемы, на них вы или уже натолкнулись или еще натолкнетесь.
Оказывается, что в Borland C++ 3.1 предусмотрена возможность для ввода строки в некоторую переменную и последующей её обработки. При этом для самого ввода строки в переменную
не обязательно объявлять указатели.

  • Код C++ Считывание строки с пробелами в переменную и вывод её на экран

По этому коду стоит отметить, что я предопределил размер строки. Последний символ в строке это признак окончания строки. Недостаток при использовании cin в том, что используется операция ввода >> , в этой операции разделителем является пробел. Вот и выходит нельзя считать строку с пробелами используя cin. Чтобы как-то исправить этот момент, разработчики C++ добавили к оператору cin метод getline. По коду прекрасно видно как этот getline использован. Вовнутрь передается переменная, которая объявлена типом char и несмотря на то что объявлена как символьная, она должна стать строкой. Еще передается размер, который должен быть у этой строки.

Приведу пример очень простой задачи с простым решением
Как посчитать количество пробелов внутри строки, введенной с клавиатуры. Для быстрого освоения материала требуется хорошо ориентироваться в темах

  • Код C++ Подсчет пробелов в строке

По коду отмечу, что вовнутрь функции, считающей число пробелов передается два параметра. Первый параметр-это строка, которую необходимо обработать. Второй параметр — это подсчитываемое число пробелов. Может быть непонятным зачем нужен знак &. Это амперсанд и он обозначает, что если внутри функции произойдут изменения принимаемого параметра, то нужно изменить и этот принимаемый параметр вне функции. Статья Передача параметров в функции в C++ для начинающих
Происходит такая эстафета
count (main) —> count(count_space) count(count_space) —> count(main)

на выходе: count(main)=count(count_space)

Также стоит отметить, что у начинающих очень распространены ошибки внутри циклов. Я решил использовать while, так вот, в этом цикле нужно всегда следить за тем, чтобы счетчик изменял свое значение, иначе цикл будет выполняться бесконечно. Плюс к этому, у начинающих может возникнуть путаница «а где счетчик менять». В приведенном примере счетчик меняется сразу за блоком проверки условия if, потому что если записать его в этот блок проверки, то если в строке пробелов нет, тогда счетчик так и не изменится, произойдет бесконечное выполнение цикла, да и вообще счетчик станет меняться только если выполнено это if условие. Вот вне блока проверки if счетчик будет изменяться в любом случае при каждом проходе цикла. (Вне блока обозначает, что менять его можно и до блока проверки и после, будет маленькая разница в значениях). Еще нужно помнить, что если счетчик не инициализировать, то он может принять какое угодно значение и тогда еще до начала выполнения цикла может быть выполнено условие цикла и цикл не сработает.

Кроме описанного варианта вместо cin.getline можно использовать gets. Для этого нужно подключить директиву #include <stdio.h>

 

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

3 комментария: Строки String в Borland C++ 3.1 для начинающих

  • Gen говорит:

    При использовании gets строку

    нужно переписать

    Автор сайта отвечает:
    )))
    а еще нужно убрать iostream и вместо cout использовать printf
    а еще нужно забыть про С++, потому как это уже язык С
    ============================================
    Так не то, чтобы нужно, но можно. Хотя вы можете аргументировать. Я спорить не буду.
    Я скажу свои аргументы:
    мешать С++ и С нехорошо. (хотя и есть задачи, решаемы только с помощью С)
    я почти во всех своих статьях использую объекты cin и cout. У них есть свои методы. Их я тоже часто использую в материалах.
    для современных компиляторов (например используемом в CodeBlocs) вообще нужно использовать тип данных string, а там чтение

    и над вашим комментарием написано про gets, оно там и было написано (я не сейчас добавил).
     
    Это не лично к вам (Gen). Это к тем, кто поймет не так как нужно вашу подсказку.

  • Евгений говорит:

    все то хорошо, только в 8 студии этот cin.getLine() не ждет пока юзер введет что-то с консоли
    void main()
    {
    char c; char s[15];
    while(1==1) {
    cout<>c;
    if (c==’0′) break;
    cout<<"vvesti text <=50\n";
    cin.getline(s, 50);
    cout <<s;
    }
    может надо очистка вх потока flush(stdin)?

    Автор сайта отвечает:
    Я вас вообще сейчас не понял. Поконкретнее можете истолковать?
     
    судя по вашему коду вам нужен массив строк, но cin.getline читает только одну, а не много. И вы видите в этом проблему. (это единственное, что я могу предположить)

  • Иван Иванов говорит:

    Имхо, не стоит использовать функцию gets(). Про неё вообще лучше забыть. Она не проверяет нарушение границы массива/строки, и более опасного вызова, чем этот, в стандартной библиотеке нет.

    Вместо gets() можно (и нужно) использовать fgets() (ну или gets_s() в новом стандарте Си).

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

- У меня компьютер сам выключается... че делать? - У тебя системник внизу стоит? - Да. - Поменяй носки... он сознание теряет.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок