Comments 26
Ошибок, которые легко допустить в C, гораздо больше четырёх :-)
Мы вполне могли хранить в качестве первых четырех символов строки байты числа, представляющего длину сообщения, которое бы следовало за ним.
То есть вы вставили в строку кусок сырых данных и удивляетесь, что строковые функции с ним некорректно работают? Вообще-то, это делается либо через структуру, либо через ручное управление памятью:
struct tx_buffer{
uint32_t len;
char data[DATA_SIZE];
}buf;
strcpy(buf.data, "Some string\n");
buf.len = sizeof(buf.len) + strlen(buf.data);
char buf[DATA_SIZE + 4];
strcpy(&buf[4], "Some string\n");
*((uint32_t*)buf) = strlen(&buf[4]) + 4;
char *mystr = «This is my string\n»;
mystr = mystr + 13;
*mystr = 'u';
Тут да, новички ошибаются часто. Поэтому если строка не должна быть константной, ее объявляют как массив
char mystr[] = "This is my string\n";
А если константной, то пишут const.
Чтобы вызвать ошибку, достаточно перед функции free добавить следующую строчку:Как можно до этого додуматься мне неизвестно.
s1 = s1 + 1;
Использование локальных переменных функции за её пределами после завершения работы функцииВот тут снова соглашусь, новички часто об этом не подозревают.
— Итого 2 ошибки, которые допускают часто (пока опыта мало, конечно) и 2, для которых надо сильно постараться.
Использование локальных переменных функции за её пределами после завершения работы функции
А как это можно сделать?
Это получается функция должна вернуть указатель на свои локальные данные! Ха, до этого надо додуматься.
По крайней мере у новичков, которые еще не разобрались с синтаксисом.
Что я только что прочитал >_<
char *s1 = malloc(255);
process(s1);
free(s1);
<.sarcsm>
А что если malloc вернет NULL
А process() будет выглядеть так:
void process(char *data)
{
memset(data, 0xff, 256);
}
Это что, еще 2 ошибки, которые легко совершить получается? (читать с удивленно саркастичной интонацией)
Пойду напишу статью "Стотыщ и одна ошибка которую легко совершить не думая"
Лучше своих ошибок напишите в комментариях. И давайте не будем про «кто в 21 веке пишет на С», поверьте пишут, там где ресурсов минимум или ассемблер или С — такой выбор.
ГЫ. дальше не читал!
Нет, ну я понимаю, что человек мучительно ищет средство заявить о себе миру хоть как-то.
Но надо же держать себе хоть как-то в рамках же ж.
И не пытаться выдавать детский лепет на лужайке впечатления от первых страниц "как научиться погроммизму за 21 минуту" как откровение.
Всю статью можно выразить фразой "не пытайтесь тащить паскалевские привычки в C".
Хаб "Системное программирование", ага.
Как страшно жить… ©
Я бы так сделал.
Записываем её.
sprintf(str_new, "%08X%s", strlen(str), str);
8 первых байт, это длина строки. В шестнадцатеричном виде.
Читаем её.
len = strtol(str_new, &str, 16);
В результате len длина строки и str указатель на саму строку.
8 первых байт, это длина строки. В шестнадцатеричном виде.4 миллиарда символов в строке? Я сейчас посмотрел одну из длинных книг, там всего около миллиона символов, и то в одной строке это хранить никто не будет. Так что хватит и 16-битной длины (4 цифры). Ну а преобразовать в число несложно:
len = 0;
if(str[0] < 'A')len += (str[0]+0x0A-'A')<<12; else len += (str[0] - '0')<<12;
if(str[1] < 'A')len += (str[1]+0x0A-'A')<< 8; else len += (str[1] - '0')<< 8;
if(str[2] < 'A')len += (str[2]+0x0A-'A')<< 4; else len += (str[2] - '0')<< 4;
if(str[3] < 'A')len += (str[3]+0x0A-'A')<< 0; else len += (str[3] - '0')<< 0;
Но все равно так делать не стоит. Если уж хочется строк в стиле С++, так и используйте std:string или хотя бы в структуру заворачивайте.
Конечно, никто так явно не вставляет нулевой символ посередине строки. Но что если мы решили разработать свой протокол со своим форматом сообщений для обмена данными между удалёнными хостами?Если человек решил разработать свой протокол на Си, то он наверняка будет знать о нулевом символе и о том, как он влияет на поведение некоторых функций (строковых в основном)
Т.к. тип char занимает в памяти ровно один байт, то логично, что для хранения длины сообщения, представленного типом long int мы бы зарезервировали для него первые четыре символа в массиве символов char[], или четыре ячейки блока данных, на которые указывает указатель char * ptr.Не факт, тип long в разных системах занимает разное кол-во байт
Вообщем не статья а сюр какой-то.
Расскажите это девелоперам на visual studio.
5 ошибок, которые легко и просто допустить в языке С