[C++] Строки и массивы. Символ окончания строки

Тема в разделе "Другие языки программирования", создана пользователем Alex1983, 3 авг 2010.

  1. Alex1983
    Оффлайн

    Alex1983 Разработчик

    Сообщения:
    848
    Симпатии:
    523
    Всем привет. Начал изучать С++.
    Вопрос такой. Как понять символ завершающий строку равен нулю(=0)?
    В массивах.
    Заранее благодарен.
     
  2. iskander-k
    Оффлайн

    iskander-k Команда форума Супер-Модератор Ассоциация VN/VIP Преподаватель

    Сообщения:
    3.733
    Симпатии:
    3.260
    '\0'-символ завершающий строковой массив. Благодаря нему можно определить где кончается массив
    Код (Text):
    char c[]={"Массив сиволов\n Какой-то текст."};
    for(i=0;c[i]!='\0';i++);//определяет сколько символов в массиве.
    если не ошибаюсь
     
    8 пользователям это понравилось.
  3. Arbitr
    Оффлайн

    Arbitr Ассоциация VN

    Сообщения:
    3.604
    Симпатии:
    2.317
    он их только переберет по одному до конца, а записать и вывести результат?)

    Добавлено через 1 минуту 57 секунд
    точнее Саня скажет но кажется там ошибочка
    хоть на С++ ничего не делаю но изучал PHP а это упрощенный С цикл по другому задается
    хотя здесь возможно и ошибаюсь
     
    2 пользователям это понравилось.
  4. iskander-k
    Оффлайн

    iskander-k Команда форума Супер-Модератор Ассоциация VN/VIP Преподаватель

    Сообщения:
    3.733
    Симпатии:
    3.260
    это отрицание - не равно
    перевожу строку
    Код (Text):

    (i=0;c[i]!='\0';i++);
     
    если значение не равно 0 !='\0' то счет идет дальше i++(счетчик работает дальше то есть прибавляет 1)
     
    Последнее редактирование: 3 авг 2010
    6 пользователям это понравилось.
  5. Arbitr
    Оффлайн

    Arbitr Ассоциация VN

    Сообщения:
    3.604
    Симпатии:
    2.317
    ну да, только имел ввиду зачем оно там? просто не нужно..задаешь начало
    и далее цикл
    хотя в С как мне говорили больше условностей..может и нужно..
     
    2 пользователям это понравилось.
  6. iskander-k
    Оффлайн

    iskander-k Команда форума Супер-Модератор Ассоциация VN/VIP Преподаватель

    Сообщения:
    3.733
    Симпатии:
    3.260
    тогда выйдет за пределы цикла.
     
    4 пользователям это понравилось.
  7. Arbitr
    Оффлайн

    Arbitr Ассоциация VN

    Сообщения:
    3.604
    Симпатии:
    2.317
    как?)) перебор идет в массиве..закончится массив закончится цикл ведь смотри, у тебя же не до нуля считается...так что... а вот если массив от -10 до +10..на нуле и выйдет из цикла?
     
  8. AlexTNT
    Оффлайн

    AlexTNT Активный пользователь

    Сообщения:
    80
    Симпатии:
    58
    Любая символьная константа, например "ОЙ У ПОЛИ КРИНИЧКА", представляет собой массив символов. Во внутреннем представлении компилятор завершает такой массив символом "\0", так что любая программа может по нему легко обнаружить конец строки. Поэтому строка занимает в памяти на один символ больше, чем записано между двойными кавычками. Нумерация элементов массива начинается с нуля. Надо помнить, что, например 'T' - это символ(буква), а ' T ' - это строка, состоящая из двух символов: 'T' и '\0'. Отсюда следует, что пустых строк не бывает.
     
    4 пользователям это понравилось.
  9. Drongo
    Оффлайн

    Drongo Ассоциация VN/VIP Разработчик

    Сообщения:
    7.902
    Симпатии:
    8.221
    Вот такую конструкцию компилятор распознает как шесть символов + один завершающий символ '\0' итого массив будет из семи символов. Если же задавать размер массива явно
    Код (Text):
     const int size = 10;  // размер символьного массива ввода
     char array[size]; // Массив с размером в 10 символов
    То нужно учитывать что сюда вместится 9 символов + завершающий символ.

    Это не ошибка, а условие не равно. Конструкция цикла, которую привёл iskander-k будет выводить символы по одному пока не встретится символ означающий конец строки.
    пока: проверяемый символ не равен завершаемому символу - производить вывод элементов массива "c"
    Код (Text):
      for(i = 0; c[i] != '\0'; i++);
         cout<<c[i];
    Это один и вариантов вывода, полезно когда нужно проверить какой-либо отдельный символ, такая конструкция обеспечивает доступ ко всем символам строки. Вывести можно и прямо

    Код (Text):
    #include <iostream>
    using namespace std;

    int main()
    {
      int z;
      char c[] = "MyString"; // Выводимая строка

      cout << "Out String = " << c << endl; // вывод как имеет ввиду Arbitr

      for(int i = 0; c[i] != '\0'; i++)
         cout << c[i]; // вывод iskander-k
      cin >> z;
      return 0;
    }
    //---------------------------------------------------------------------------
    А вот так.
    Код (Text):
    char c[] = "MyString"; // Выводимая строка
    Это всё равно что
    Код (Text):
    char c[] = { 'M', 'y', 'S', 't', 'r', 'i', 'n', 'g', '\0' };
    Последний нуль. Элементы массив начинается с нуля

    Код (Text):
    c[0] не равно '\0' - цикл продолжается
    c[1] не равно '\0' - цикл продолжается
    c[2] не равно '\0' - цикл продолжается
    c[3] не равно '\0' - цикл продолжается
    c[4] не равно '\0' - цикл продолжается
    c[5] не равно '\0' - цикл продолжается
    c[6] не равно '\0' - цикл продолжается
    c[7] не равно '\0' - цикл продолжается
    c[8] не равно '\0' - цикл продолжается
    c[9] равно '\0' - цикл прерывается

    Воспринимай его как некую метку, необходимую компилятору\программисту для определения конца строки.
     
    4 пользователям это понравилось.
  10. Arbitr
    Оффлайн

    Arbitr Ассоциация VN

    Сообщения:
    3.604
    Симпатии:
    2.317
    уже понял, не знал что завершается строка 0 просто

    Добавлено через 1 минуту 11 секунд
    у нас счетчик по другому шел..не до нуля..
     
  11. Drongo
    Оффлайн

    Drongo Ассоциация VN/VIP Разработчик

    Сообщения:
    7.902
    Симпатии:
    8.221
    Arbitr, А это только в символьных типах char, есть ещё тип string, там проще, а ещё класс AnsiString, там вообще без проблем всё.
     
    2 пользователям это понравилось.

Поделиться этой страницей