- 1
- 2
- 3
- 4
string buf;
...
char c_buf[MAX_LEN];
strncpy(c_buf, buf.c_str(), MAX_LEN);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+144
string buf;
...
char c_buf[MAX_LEN];
strncpy(c_buf, buf.c_str(), MAX_LEN);
в чём ошибка?
UncleAli 10.05.2010 21:19 # +3
skor4ik 10.05.2010 21:23 # −4
UncleAli 10.05.2010 21:44 # +2
funny_rabbit 10.05.2010 21:25 # 0
?а переполнения действительно не будет
skor4ik 10.05.2010 21:28 # 0
код strncpy(c_buf, buf.c_str(), MAX_LEN - 1); тоже не верный
funny_rabbit 10.05.2010 21:35 # 0
skor4ik 10.05.2010 21:38 # 0
почему? в этом и есть загадка
archer 10.05.2010 22:05 # 0
char c_buf[MAX_LEN + 1];
strncpy(c_buf, buf.c_str(), MAX_LEN);
c_buf[MAX_LEN] = 0;
skor4ik 10.05.2010 22:12 # 0
TarasB 10.05.2010 22:19 # −5
cbuf := buf;
UncleAli 10.05.2010 22:35 # 0
comnimh 10.05.2010 23:07 # 0
Нормально там все.
skor4ik 10.05.2010 23:10 # 0
нужно использовать memcpy
comnimh 10.05.2010 23:12 # 0
http://www.cplusplus.com/reference/string/string/c_str/
skor4ik 10.05.2010 23:48 # 0
вот код для примера:
string s("qwerty");
s[3]='\0';
printf("%s\n", s.c_str());
cout << s << endl;
cout << "s size:"<<s.size() << endl;
null-байт не является концом строки, c_str() просто возвращает указатель на начало буфера, гарантируя ноль в конце, а не на си-строку.
cfdev 10.05.2010 23:15 # 0
> Generates a null-terminated sequence of characters
comnimh 10.05.2010 23:15 # 0
Привет :)
cfdev 10.05.2010 23:41 # 0
skor4ik 10.05.2010 23:52 # 0
cfdev 11.05.2010 10:21 # 0
Говногость 11.05.2010 11:35 # 0
зы: Надеюсь не сильно ошибся, сделав предположение относительно самых часто используемых вами языков. :)
Говногость 11.05.2010 06:19 # 0
> string::c_str
> Generates a null-terminated sequence of characters
Строка заканчивается нулём. Там не написано, что посреди строки не может быть null символа. Если не написано, то он может, взависимости от того, что поместили в std::string.
cfdev 11.05.2010 10:21 # 0
По уму надо кодировать в utf8. А нахрена у utf8 нули посередине, я не знаю.
cfdev 11.05.2010 10:29 # +1
Только вот говнокодом будет не использование strncpy, а вставка этого нуля.
Говногость 11.05.2010 11:36 # 0
funny_rabbit 10.05.2010 23:56 # 0
lay 11.05.2010 00:23 # 0
absolut 11.05.2010 00:40 # +1
Но если дело тупо в этих трех строчках, то надо так:
string buf;
...
char c_buf[MAX_LEN];
strncpy(c_buf, buf.c_str(), MAX_LEN-1);
c_buf[MAX_LEN-1]='\0';
Самое страшное, что тут может случиться это усечение строки. Но для того strncpy() и придумана.
Если говорить о теме наличия нулей в string'е, то сам дурак, если зная это копируешь в С-строку.
skor4ik 11.05.2010 01:02 # 0
не в С-строку, а в неконстантный буффер, а буфферы используются постоянно =)
>Самое страшное, что тут может случиться это усечение строки. Но для того strncpy() и придумана.
верно, оно и случается, суть в том, что для копирования буффера из std::string в буффер си нужно использовать memcpy вместо strncpy, но большинство новичков не задумываясь используют strncpy, так как думают, что string содержит null-байт только на конце.
funny_rabbit 11.05.2010 06:47 # +3
skor4ik 11.05.2010 13:38 # 0
уже хорошо, а чем плохо использовать std::string для хранения буфера?
absolut 11.05.2010 13:59 # 0
pushkoff 11.05.2010 14:15 # 0
Говногость 11.05.2010 14:22 # 0
Говнокод там, где использовали strncpy - строковые функции, не предназначенные для бинарных данных.
absolut 11.05.2010 14:48 # 0
Чтобы не вводить в заблуждение читающего код хотя бы. А если будете использовать другой тип символа в std::basic_string, то надо еще char_traits для него определить. А оно вам надо?
Про шурупы забитые молотками я думаю говорить не стоит.
skor4ik 11.05.2010 15:31 # 0
>Чтобы не вводить в заблуждение читающего код хотя бы.
достаточно написать комментарий, что здесь стринг используется для хранения буффера (под буффером я тут понимаю массив байтов)
pushkoff 11.05.2010 15:32 # 0
bober_maniac 11.05.2010 07:05 # +1
Для копирования области памяти в С++ следует использовать memcpy и не задумываться о каких-то там нулях, так как размер буфера памяти хранится где-то сугубо отдельно.
Для копирования строк в формате BSTR следует пользоваться специальными функциями, так как данные строки не являются совместимыми со строками С++.
Читать из буфера произвольные даннные в бинарном формате в строку, а потом использовать ее как строку С++, если она заведомо содержит не строковые данные, может только тупорылый мудак, который вообще ничего не понимает в программировании. Читать бинарные данные в std::string может только двоичный мудак с фимозгом рака.
haskell 11.05.2010 07:11 # −1
bober_maniac 11.05.2010 07:18 # 0
haskell 11.05.2010 07:19 # 0
bober_maniac 11.05.2010 07:20 # 0
Говногость 11.05.2010 07:50 # 0
зы: Нелюблю писать С++, тк очень длительно. Неужели нельзя было назвать С+. Когда Страус упал и умер, то плюс раздвоился?
haskell 11.05.2010 07:55 # +2
Fix
Говногость 11.05.2010 08:04 # 0
Говногость 11.05.2010 07:42 # 0
Зачем программисты задумываются над ней?
Потому-что ищут наиболее оптимальный путь реализации. При этом не брезгуют выбором наиболее оптимального алгоритма. В функциональных языках алгоритм - единственное, на что влияет программист.
В свете этого программа на С++ по скорости может выиграть у программы, написанной на ФЯП.
Не могу спорить, что ФЯП программы легче распараллеливаются автоматически, но с ручной качественным распараллеливанием С++ная программа выиграет у ФЯПнутой программы.
Не могу спорить, что ФЯП программы легче писать, не задумываясь о мелочах реализации, а значит быстрее.
haskell 11.05.2010 07:48 # 0
Это практически единственное (плюс структуры данных), что имеет значение при разработке.
>>с ручной качественным распараллеливанием С++ная программа выиграет у ФЯПнутой программы.
Действительно, зачем Ericsson Эрланг? Надо все на асме переписать. Прямо сейчас. Через 50 лет встретимся.
Говногость 11.05.2010 08:01 # 0
А вот с ручным распараллельванием и всякими SSE MMX 3DNow! можно получить приличную скорость и на пользовательской машине.
Да и программиста проще найти. Вы на ФЯП пишете для заказчиков или таких заказчиков нет?
Говногость 11.05.2010 08:03 # 0
Говногость 11.05.2010 08:05 # 0
haskell 11.05.2010 08:10 # 0
зы На F# пишу прямо сейчас.
Говногость 11.05.2010 08:41 # 0
Да и о ФЯП в целом, но хочу их увеличить, да и пишу в на императивных языках (пока), в частности приемущественно на С++.
1)Если не такой секрет, то расскажите о каких-нибудь ваших проектах и на каком ФЯП писали? Очень интересна их область использования.
2)В F# пишите ли вы программы с графическим пользовательским интерфейсом(GUI) и удобно ли это?
3)F# позволяет экспортировать функции, что-бы пользоваться ими из неманаджет кода, например на С++?
Говногость 11.05.2010 08:41 # 0
absolut 11.05.2010 08:09 # 0
AxisPod 11.05.2010 06:18 # 0
absolut 11.05.2010 08:15 # 0
del 11.05.2010 08:37 # 0
absolut 11.05.2010 10:07 # +2
- Летит N самолетов ... нет, N мало, возьмём M.
del 11.05.2010 10:18 # +2
- Летит N самолетов ... нет, N мало, возьмём M, и оба реактивные.
Говногость 11.05.2010 11:41 # 0
Говногость 11.05.2010 11:48 # 0
pushkoff 11.05.2010 14:34 # 0
skor4ik 11.05.2010 15:35 # 0
ifstream fin("file.txt", ios_base::in);
stringstream stream_buf;
stream_buf << fin.rdbuf();
string buf = stream_buf.str();
теперь buf содержит бинарное содержимое файла