В чем ошибка использования strlen?

128
22 декабря 2020, 11:40
#include <iostream>
#define MAXLENGTH 128
int main()
{
    char word[MAXLENGTH];
    std::cin.getline(word, MAXLENGTH);
    word[strlen(word) + 1] = 't';
    word[strlen(word) + 2] = 0x30;
    std::cout << word;
    return 0;
}

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

Answer 1

Почему не выводит текст с буквой t на конце?

Конец C-строки обозначется сиволом \0. После вызова getline буфер word содержит символ \0 в позиции word[strlen(word)]. Этот и есть конец вашей строки.

Вы записываете в этот буфер какие-то дополнителные символы после символа конца строки, в позиции word[strlen(word) + 1] и word[strlen(word) + 2]. Эти символы не являются частью строки и никакого влияния не ее содержимое не оказывают.

Что вы и наблюдаете.

Если вы хотели добавить символ 't' к вашей исходной строке, то добавлять его надо было вместо символа конца строки, а не после него. И затем надо не забыть сформировать символ конца строки на новом месте

size_t len = std::strlen(word);
word[len] = 't';
word[len + 1] = '\0';

Правильно ли я пытаюсь задать конец строки?

Я не вижу в вашем коде никаких явных попыток "задать конец строки". О чем речь?

Answer 2
strcat(word,"t")

будет проще и надежнее... Но если уж вы хотите именно так, как хотите :) - то

int l = strlen(word);
word[l] = 't';
word[l+1] = 0;

Так как после добавления t уже никто не гарантирует, что следующий за ним символ - нулевой...

Ну и, понятно, в обоих случаях остается молиться, чтоб места в word хватило на добавление...

READ ALSO
SDL2 - как перемещать окно без заголовка

SDL2 - как перемещать окно без заголовка

Как правильно в SDL2 перемещать окно без заголовка, по аналогии с winapi используя WM_NCHITTEST

129
Avoid unnamed objects with custom construction and destruction (es.84)

Avoid unnamed objects with custom construction and destruction (es.84)

К примеру есть такой простой код

97
с++ *** stack smashing detected ***: &lt;unknown&gt; terminated Aborted (core dumped)

с++ *** stack smashing detected ***: <unknown> terminated Aborted (core dumped)

Я пытаюсь сравнить два элемента массива, текущий и предыдущий, ставлю break; чтобы закончить выполнение цикла и выводится такое сообщение в консоль...

104