Перейти к содержанию
    

Олимпиада программистов

Скажите, а нафига "sizeof(char)" делать?

Есть несколько правил "хорошего", "структурного" стиля программирования на C, которым учат в вузах. Например, "не использовать в С оператор goto", "использовать локальные переменные вместо глобальных, где это возможно", "давать переменным говорящие имена" и т. п.

sizeof(char) - это следствие из усвоенного правила "не использовать прямых констант в тексте программы, заменяя их по возможности дефайнами или константами".

strlen(from_str)*sizeof(char)

Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо в целом направление не верное в решении этой задачи.

В целом, постановка задачи неправильная.

Что вас в коде не устроило? приведите те ситуации, когда он не отработает?

 

зы

вот нафиг я от работы отвлекся)), теперь с этими израилитянами переписываюсь, жду, что они скажут(думаю, что ничего не скажут)

 

 

 

strlen(from_str)*sizeof(char)

Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.

Ну, вам виднее, товарисчь. Пиписьками меряться не стану с вами.

Хотя соглашусь, лишнее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Далеко не всегда.
Верно сказать что sizeof(char)==1 байт всегда и везде, ну а байт может быть любой размерности. Поэтому формально Буратино прав и нет никаких доводов в пользу использования sizeof(char) вместо 1 кроме эстетических.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

am1808, если открыть реализацию realloc, то там похоже есть проверка аргументов. Еще мне не очень, что вы несколько раз strlen вызываете, наверняка можно обойтись и одним разом на функцию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так еще можжно:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

    
void str_cpy (char **a,   char *b) {  
   *a = b;
}


void str_cat (char **a,  char *b){
   int _size1 = strlen(b);  
   int _size2 = strlen(*a);  
   char * tmp = NULL;
   
   tmp = realloc(tmp, _size1 + _size2 + 2);
   memmove(tmp , *a, _size2);
   memmove(tmp + _size2, b, _size1);
   
   *a = tmp;
}

int main() {
   char *s = NULL;
  
   str_cpy(&s, "Hola Mola");    
   str_cpy(&s, s+5);    
   str_cat(&s," World");   
      
   return 0;
}

 

проверку аргументов пока вынесем за скобки:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Верно сказать что sizeof(char)==1 байт всегда и везде, ну а байт может быть любой размерности.

А у нас в char`е два байта, при том, что в байте восемь бит. Двоичных, на всякий случай, а то мало ли у кого как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у нас в char`е два байта, при том, что в байте восемь бит. Двоичных, на всякий случай, а то мало ли у кого как.
У вас это где, в компиляторе для TI dsp'шок?. Стандарт однозначно говорит, что sizeof(char)=1. А у вас сколько sizeof(char) выдаёт?

 

void str_cpy (char** a, char* b) {*a = b;}

А как насчёт того, что в ТЗ сказано, что каждая функция должна быть порядка 7 строк? А тут всё в 1 влезло...;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как насчёт того, что в ТЗ сказано, что каждая функция должна быть порядка 7 строк? А тут всё в 1 влезло...;)

 

"не более чем 7 строк кода на функцию"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"не более чем 7 строк кода на функцию"

Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг.

Вы действительно хотите комментариев к этому коду?

Изменено пользователем igorle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема общения в виртуале - никогда не уверен - человек шутит, или серьезно. Ваш вариант выглядит как троллинг.

Вы действительно хотите комментариев к этому коду?

 

А какой смысл размещать его тут кроме как получить каменты? Конечно хочу! Кстати данный код работает и выполняет функции. Почему так нельзя сделать!?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой смысл размещать его тут кроме как получить каменты? Конечно хочу! Кстати данный код работает и выполняет функции. Почему так нельзя сделать!?

Ну, некоторые пишут, чтобы получать лулзы, глядя как люди рвут на себе волосы

"Код работает" - это совсем не аргумент. Надо не код, который один раз сработает с данным примером, а код, который будет работать в библиотеке. Он будет вызываться миллионы раз как с короткими, так и мегабайтными строками.

void str_cpy (char **a,   char *b) {  
   *a = b;
}

Кто сказал что сорс будет существовать после вызова функции? Может быть я работаю с буфером, потом копирую строку и снова пишу в буфер. Или освобождаю буфер. Что будет с сохраненным значением?

void str_cat (char **a,  char *b){
   int _size1 = strlen(b);  
   int _size2 = strlen(*a);

Функция может быть вызвана для неинициализированного дестинейшена. strlen для NULL - крэш

   char * tmp = NULL;
   
   tmp = realloc(tmp, _size1 + _size2 + 2);

Зачем вызывать реаллок для NULL? Зачем двойка добавлена?

   memmove(tmp , *a, _size2);
   memmove(tmp + _size2, b, _size1);
   
   *a = tmp;
}

Старое значение *a перетерто. Память, на которую указывала *a - потеряна. Результирующая строка не ограничена нулем.

Изменено пользователем igorle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

strlen(from_str)*sizeof(char)

Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.

В таком виде - да. Идея хорошая, но реализация чуть подкачала. Для данного случая то же самое по сути
strlen(from_str)*sizeof(*from_str)

, но если char станет wchar отработает нормально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нее, не прокатит, множитель в виде sizeof(char) лишний, но ничего плохого в нем нет.

 

Типы параметров функции точно определены, поэтому sizeof(*from_str) строго определено.

Перегрузки тут нет никакой, это в плюсах можно так сделать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...