LINUX.ORG.RU

Лишние символы в конце строки - C

 , , ,


0

1

Я выполняю операции декодирования, записываю всё это в массив длиной 5000, и конвертирую его в понятный для программы формат. В большистве случаев строка отображается нормально, но в некоторых выдаёт такое: «SourceX\x06». В норме выдаёт «Source».

Это мой код:

char string[5000] = {‘S’,‘o’,‘u’,‘r’,‘c’,‘e’,‘\0’};

char *out = malloc(strlen(string) + 1);

strcpy(out, string);

return out;

Помогите, я не знаю в чём дело, пробовал уменьшать длину массива до 6, убирал при этом +1, но не помогло, в конце опять этот бред.



Последнее исправление: gradle (всего исправлений: 2)
Ответ на: Странно от anonymous

P.S. Запомните, твари — Я НЕ РОБОТ!!! (ТС, это не тебе, если что…)

Перестанешь тереть кукисы – запомним. Роботы.

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

//тут после символов лежит мусор, не забывай

Нет, там гарантируются нули.

anonymous
()
Ответ на: комментарий от Deleted

calloc не гарантирует что в массиве что он вернет все будет занулевано.

В чём же тогда его отличие от malloc?

cPunk ★★
()
Ответ на: комментарий от gradle

Вообще отвратительный язык, хуже java в 100 раз.

Так не пиши на нём.

andalevor ★★★
()
Ответ на: комментарий от cPunk

Да я запутался в мыслях, все он работает как надо.

Deleted
()
Ответ на: комментарий от grem

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

andalevor ★★★
()

Отличный пятничный трэд, давно так не смеялся

olelookoe ★★★
()
Ответ на: комментарий от gradle

Ох, тяжёлый день пятница… Я хотел написать, что тебе уже 100 раз написали, что в тех кусках, что ты приводишь, ошибок нет. Но упорно не хочешь собирать минимальный пример с ошибкой.

andalevor ★★★
()
Ответ на: комментарий от gradle

Я еле разобрался с этим, как же я ненавижу C! Неделю потерял из-за этого! Вся причина была в том что я забыл передать в конце строки во время преобразований ‘\0’, в двух местах сразу, а декодер у меня особенный, если получит слишком много неверных символов, вернёт пустую строку, поэтому она то пустая была то с двумя символами, смотря какой мусор. Никто мне здесь это даже не подсказал, умники.

gradle
() автор топика
Ответ на: комментарий от gradle

Вся причина была в том что я забыл передать в конце строки во время преобразований ‘\0’, в двух местах сразу

Так в приведённых кусках кода этого не было.

Никто мне здесь это даже не подсказал, умники.

Телепаты в отпуске. Привёл бы соответствующий кусок кода, причём в нормально отформатированном виде, как тебя несколько человек просило — результат мог быть другим.

Неделю потерял из-за этого!

Для начинающего это нормально.

как же я ненавижу C!

Си — переносимый ассемблер, он никому не обязан быть лёгким.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от gradle

Зачем ты используешь Си, если в нём не шаришь? Вероятно, и задача для него у тебя не подходящая.

anonymous
()
Ответ на: комментарий от anonymous

Он писал, что его задача — пропатчить чужую библиотеку, так что выбор невелик.

Другое дело, что раз уж возникла такая задача, надо всегда помнить про чужой монастырь и не перекладывать своё неосиляторство на язык…

hobbit ★★★★★
()

Обьясните, почему char *out = malloc(strlen(string) + 1); а не char *out = malloc(sizeof(char) * (strlen(string) + 1));

и почему нет приведения типов? Так вообще делают?

ilgoo
()
Ответ на: комментарий от ilgoo

Что нашёл в интернете то и вставил

gradle
() автор топика
Ответ на: комментарий от ilgoo

и почему нет приведения типов? Так вообще делают?

Потому что это С, void* «конвертируется» с любыми указателями, ну кроме указателей на функции. Да, так и делают.

insw
()
Ответ на: комментарий от insw

Потому что это С, void* «конвертируется» с любыми указателями

Вообще-то немного не так. void * и был специально для этого придуман, чтобы конвертироваться. Весьма сильно позже.

vodz ★★★★★
()
Ответ на: комментарий от vodz

void* и был специально для этого придуман, чтобы конвертироваться.

Ну да, про это и хотел сказать.

insw
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.