Массивы(Строки) bugs.. :(

Тема в разделе "WASM.BEGINNERS", создана пользователем dj0nik, 5 дек 2007.

  1. dj0nik

    dj0nik New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2007
    Сообщения:
    15
    С++. набрался теории, решил практиковаться.. в книге даётся два обсалютно идентичных способа объявления символьных массивов:
    Например
    Код (Text):
    1. char MyName[] = {'d','j','o','n','i','k'};
    2. char MyName[] = "djonik";
    если к обоим массивам применить функцию strlen(), то в первом случае значение будет равно 47, а во втором уже правильно 6! Почему так происходит?
    Самое интересное, когда писал генератор паролей и обнаружил эту тему, два раза пересчитывал английские буквы на клаве, strlen() вместо 26 выводила 31..
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    dj0nik
    В первом варианте нет завершающего нуля.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    потому что ты забыл завершающий ноль в первом случае
    строки в Си обязаны заканчиваться нулевым байтом.

    правильно так:

    char MyName[] = {'d','j','o','n','i','k', 0};

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

    а объявление строки через "abcdef" автоматически помещают завершающий ноль в конце. вот и все дела
     
  4. dj0nik

    dj0nik New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2007
    Сообщения:
    15
    ок, спасибо всем!