сложение строк
От: DemAS http://demas.me
Дата: 07.03.08 09:22
Оценка:
А есть ли в C более короткая запись сложения двух строк?

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

int main() {
   char *s1 = "abc";
   char *s2 = "def";
   int i;

   for (i=1; i<=10; i++) {
     char *sum = (char*)malloc(255);
     sum[0] = '\0';
     strcat(sum, s1);
     strcat(sum, s2);
     printf("%s\n", sum);
     free(sum);
   }
}
Posted via RSDN NNTP Server 2.1 beta
Re: сложение строк
От: ДимДимыч Украина http://klug.org.ua
Дата: 07.03.08 09:25
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>А есть ли в C более короткая запись сложения двух строк?


В C вообще строк нет, не говоря уж об их сложении.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: сложение строк
От: DemAS http://demas.me
Дата: 07.03.08 09:29
Оценка:
Не придирайся, это не я придумал:
#include <string.h>
Posted via RSDN NNTP Server 2.1 beta
Re: сложение строк
От: LaptevVV Россия  
Дата: 07.03.08 09:32
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>
DAS>#include <string.h>
DAS>#include <stdlib.h>
DAS>#include <stdio.h>
DAS>#include <unistd.h>

DAS>int main() {
DAS>   char *s1 = "abc";
DAS>   char *s2 = "def";
DAS>   int i;

DAS>   for (i=1; i<=10; i++) {
DAS>     char *sum = (char*)malloc(255);
DAS>     sum[0] = '\0';
DAS>     strcat(sum, s1);
DAS>     strcat(sum, s2);
DAS>     printf("%s\n", sum);
DAS>     free(sum);
DAS>   }
DAS>}
DAS>

А зачем 10 раз сцепляешь? Просто для тренировки?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: сложение строк
От: DemAS http://demas.me
Дата: 07.03.08 09:35
Оценка:
> А зачем 10 раз сцепляешь? Просто для тренировки?

Просто демо пример. В реальной программе на каждом шаге цикла будут
складываться разные строки.

Интресует, есть ли готовая обертка над последовательностью действий:

1) обрезать то, что было заполнено на предыдущем шаге
2) скопировать первую строку
3) скопировать вторую строку
Posted via RSDN NNTP Server 2.1 beta
Re: сложение строк
От: Bell Россия  
Дата: 07.03.08 09:37
Оценка: 3 (1) +1
Здравствуйте, DemAS, Вы писали:

DAS>А есть ли в C более короткая запись сложения двух строк?


DAS>
DAS>#include <string.h>
DAS>#include <stdlib.h>
DAS>#include <stdio.h>
DAS>#include <unistd.h>

DAS>int main() {
DAS>   char *s1 = "abc";
DAS>   char *s2 = "def";
DAS>   int i;

DAS>   for (i=1; i<=10; i++) {
DAS>     char *sum = (char*)malloc(255);
DAS>     sum[0] = '\0';
DAS>     strcat(sum, s1);
DAS>     strcat(sum, s2);
DAS>     printf("%s\n", sum);
DAS>     free(sum);
DAS>   }
DAS>}

DAS>



char *s1 = "abc";
char *s2 = "def";
char *s3 = (char*)malloc(strlen(s1) + strlen(s2) + 1);
sprintf(s3, "%s%s", s1, s2);
free(s3);
Любите книгу — источник знаний (с) М.Горький
Re: сложение строк
От: Sharp Eye Россия  
Дата: 07.03.08 09:47
Оценка: +1
Здравствуйте, DemAS, Вы писали:

[skip]

М.б. что-то вроде этого?


char * concat(const char * s1, const char * s2)
{
    size_t l1 = strlen(s1);
    size_t l2 = strlen(s2);
    size_t len = l1 + l2 + 1;

    char * dst = (char *)malloc(len);

    memcpy(dst, s1, l1);
    memcpy(dst + l1, s2, l2);
    dst[len - 1] = 0;

    return dst;
}

...

char * str = concat("abc", "def");


printf(str);

free(str);
Re[2]: сложение строк
От: DemAS http://demas.me
Дата: 07.03.08 09:54
Оценка:
Ну, что-то типа этого, только искал стандартное, а не самописное.
Вариант Bell вполне устроил.

Кстати, в предложенном тобой коде мне не нравится то, что память
вызывается в функции, а освобождается в нее ее. То есть, тот, кто
использует функцию может даже не знать, что он что-то обязан освободить.
Posted via RSDN NNTP Server 2.1 beta
Re: сложение строк
От: igna Россия  
Дата: 07.03.08 09:57
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>     sum[0] = '\0';
DAS>     strcat(sum, s1);
DAS>     strcat(sum, s2);


Можно заменить на:

     strcat(strcpy(sum, s1), s2);
Re[3]: сложение строк
От: Angler Россия  
Дата: 07.03.08 10:10
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Кстати, в предложенном тобой коде мне не нравится то, что память

DAS>вызывается в функции, а освобождается в нее ее. То есть, тот, кто
DAS>использует функцию может даже не знать, что он что-то обязан освободить.

коментируй, см. к примеру strdup
Re[3]: сложение строк
От: Sharp Eye Россия  
Дата: 07.03.08 10:26
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Ну, что-то типа этого, только искал стандартное, а не самописное.

DAS>Вариант Bell вполне устроил.

sprintf более универсальная функция, чем этого требует твоя задача.

DAS>Кстати, в предложенном тобой коде мне не нравится то, что память

DAS>вызывается в функции, а освобождается в нее ее. То есть, тот, кто
DAS>использует функцию может даже не знать, что он что-то обязан освободить.

Ну да, есть немного. Пардон, исправляюсь:



char * concat(char * dst, const char * s1, const char * s2)
{
    size_t l1 = strlen(s1);
    size_t l2 = strlen(s2);
    size_t len = l1 + l2 + 1;

    memcpy(dst, s1, l1);
    memcpy(dst + l1, s2, l2);
    dst[len - 1] = 0;

    return dst;
}

...

    char * s1 = "abc";
    char * s2 = "def";

    // сами вычисляем размер, сами выделяем память
    char * str = (char *)malloc(strlen(s1) + strlen(s2) + 1);
    str = concat(str, s1, s2);

    printf(str);

    free(str);

    char buffer[255];

    // можно использовать стек
    str = concat(buffer, s1, s2);
    printf(str);
Re[3]: сложение строк
От: Bell Россия  
Дата: 07.03.08 10:28
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Ну, что-то типа этого, только искал стандартное, а не самописное.

Судя по всему, стандартной функции нет
DAS>Вариант Bell вполне устроил.
Проверь на производительность, если это критично. ИМХО вариант с memcpy должен быть быстрее.

DAS>Кстати, в предложенном тобой коде мне не нравится то, что память

DAS>вызывается в функции, а освобождается в нее ее. То есть, тот, кто
DAS>использует функцию может даже не знать, что он что-то обязан освободить.

Ну это вопрос докуменитрования — strdup тоже выделяет память, которую должен освободить пользователь.
Так что можно просто переименовать concat в concat_and_dont_forget2free_result
Любите книгу — источник знаний (с) М.Горький
Re[2]: сложение строк
От: igna Россия  
Дата: 07.03.08 10:37
Оценка:
Здравствуйте, Bell, Вы писали:

B>sprintf(s3, "%s%s", s1, s2);


Да, но к сожалению, если в этом месте будет ошибка вроде:

sprintf("%s%s", s1, s2, s3);


, то немаловероятно, что компилятор ее не заметит.

Это замечание относится ко всем функциям со строкой форматирования, потому может быть не стоит использовать их там, где можно обойтись функциями из <string.h>.
Re[4]: сложение строк
От: Sharp Eye Россия  
Дата: 07.03.08 10:37
Оценка:
Здравствуйте, Sharp Eye, Вы писали:

[skip]

А потом, мы еще немного упрощаем функцию, и получаем...



char * concat(char * dst, const char * s1, const char * s2)
{
    *dst = 0;

    strcat(dst, s1);
    strcat(dst, s2);

    return dst;
}



... твой вариант, только на 3 строчки короче:



for (i=1; i<=10; i++) {
     char *sum = (char*)malloc(255);
     concat(sum, s1, s2);
     printf("%s\n", sum);
     free(sum);
   }
Re[2]: сложение строк
От: Plague Россия 177230800
Дата: 07.03.08 10:39
Оценка:
Здравствуйте, igna, Вы писали:

I>Можно заменить на:


I>
I>     strcat(strcpy(sum, s1), s2);
I>


Тогда уж сразу так :
    char *sum = strcat(strcpy(malloc(strlen(s1)+strlen(s2)+1), s1), s2);
    printf(sum);
    free(sum);
... << RSDN@Home 1.2.0 alpha rev. 787>>
Re[3]: сложение строк
От: Plague Россия 177230800
Дата: 07.03.08 10:42
Оценка:
Здравствуйте, igna, Вы писали:

I>Это замечание относится ко всем функциям со строкой форматирования, потому может быть не стоит использовать их там, где можно обойтись функциями из <string.h>.


У меня решение было такое же как у Bell, но перегрузил Janus, а ответ уже дали... )

в добавок sprintf СЕРЬЕЗНО тормознее остальных решений...
... << RSDN@Home 1.2.0 alpha rev. 787>>
Re[4]: сложение строк
От: Bell Россия  
Дата: 07.03.08 10:45
Оценка:
Здравствуйте, Plague, Вы писали:

P>Здравствуйте, igna, Вы писали:


I>>Это замечание относится ко всем функциям со строкой форматирования, потому может быть не стоит использовать их там, где можно обойтись функциями из <string.h>.


P>У меня решение было такое же как у Bell, но перегрузил Janus, а ответ уже дали... )

Ну уж извиняйте

P>в добавок sprintf СЕРЬЕЗНО тормознее остальных решений...

Я в этом тоже признался
Любите книгу — источник знаний (с) М.Горький
Re[5]: сложение строк
От: igna Россия  
Дата: 07.03.08 10:46
Оценка: +1
Здравствуйте, Sharp Eye, Вы писали:

SE>char * concat(char * dst, const char * s1, const char * s2)
SE>{
SE>    *dst = 0;

SE>    strcat(dst, s1);
SE>    strcat(dst, s2);

SE>    return dst;
SE>}


Если заменить первый strcat на strcpy, то и обнуление *dst будет не нужно.

И если писать свою функцию, то можно и об эффективности позаботиться, поскольку неизвестно заранее, не будет ли она когда-либо использована в ситуации, где будет важна максимальная скорость. Я имею ввиду то, что у тебя второй strcat пробегает строку с самого начала в поисках нуля.

И последнее (спорное): Я бы вернул указатель на конец строки, поскольку указатель на начало у вызывающего уже есть.
Re[6]: сложение строк
От: Sharp Eye Россия  
Дата: 07.03.08 10:59
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Sharp Eye, Вы писали:


I>
SE>>char * concat(char * dst, const char * s1, const char * s2)
SE>>{
SE>>    *dst = 0;

SE>>    strcat(dst, s1);
SE>>    strcat(dst, s2);

SE>>    return dst;
SE>>}
I>


I>Если заменить первый strcat на strcpy, то и обнуление *dst будет не нужно.


I>И если писать свою функцию, то можно и об эффективности позаботиться, поскольку неизвестно заранее, не будет ли она когда-либо использована в ситуации, где будет важна максимальная скорость. Я имею ввиду то, что у тебя второй strcat пробегает строку с самого начала в поисках нуля.


I>И последнее (спорное): Я бы вернул указатель на конец строки, поскольку указатель на начало у вызывающего уже есть.

Все подобные функции возвращают dst.
Re[7]: сложение строк
От: igna Россия  
Дата: 07.03.08 11:14
Оценка:
Здравствуйте, Sharp Eye, Вы писали:

SE>Все подобные функции возвращают dst.


Да. Что в общем то бесполезно, зато привычно.
Re[4]: сложение строк
От: VEAPUK  
Дата: 08.03.08 11:20
Оценка:
Здравствуйте, Sharp Eye, Вы писали:

SE>Здравствуйте, DemAS, Вы писали:


DAS>>Ну, что-то типа этого, только искал стандартное, а не самописное.

DAS>>Вариант Bell вполне устроил.

SE>sprintf более универсальная функция, чем этого требует твоя задача.


DAS>>Кстати, в предложенном тобой коде мне не нравится то, что память

DAS>>вызывается в функции, а освобождается в нее ее. То есть, тот, кто
DAS>>использует функцию может даже не знать, что он что-то обязан освободить.

SE>Ну да, есть немного. Пардон, исправляюсь:



SE>

SE>char * concat(char * dst, const char * s1, const char * s2)
SE>{
SE>    size_t l1 = strlen(s1);
SE>    size_t l2 = strlen(s2);
SE>    size_t len = l1 + l2 + 1;

SE>    memcpy(dst, s1, l1);
SE>    memcpy(dst + l1, s2, l2);
SE>    dst[len - 1] = 0;

SE>    return dst;
SE>}

SE>...

SE>    char * s1 = "abc";
SE>    char * s2 = "def";

SE>    // сами вычисляем размер, сами выделяем память
SE>    char * str = (char *)malloc(strlen(s1) + strlen(s2) + 1);
SE>    str = concat(str, s1, s2);

SE>    printf(str);

SE>    free(str);

SE>    char buffer[255];

SE>    // можно использовать стек
SE>    str = concat(buffer, s1, s2);
SE>    printf(str);

SE>

Хм. а как strlen работает, прямой перебор?
Если да и нужна скорость, то лучше так:

char * concat(char * dst, const char * s1, const char * s2, size_t l1, size_t l2, size_t len)
{
    memcpy(dst, s1, l1);
    memcpy(dst + l1, s2, l2);
    dst[len - 1] = 0;

    return dst;
}

...

    char * s1 = "abc";
    char * s2 = "def";
        
    size_t l1, l2, len;
        
    l1 = strlen(s1);
    l2 = strlen(s2);
    len = l1+l2+1;
    // сами вычисляем размер, сами выделяем память
    char * str = (char *)malloc(1en);
    str = concat(str, s1, s2, l1, l2, len);

    printf(str);

    free(str);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: сложение строк
От: dmitry_npi Россия  
Дата: 09.03.08 09:13
Оценка:
Здравствуйте, igna, Вы писали:
I>Да, но к сожалению, если в этом месте будет ошибка вроде:

I>
I>sprintf("%s%s", s1, s2, s3);
I>

I>, то немаловероятно, что компилятор ее не заметит.

Думаю, что заметит. Он скажет "Cannot convert from 'const char*' to 'char*'"
Атмосферная музыка — www.aventuel.net
Re: сложение строк
От: Roman Odaisky Украина  
Дата: 09.03.08 21:16
Оценка: 10 (1) +1
Здравствуйте, DemAS, Вы писали:

DAS>А есть ли в C более короткая запись сложения двух строк?


1. В C строк нет.
2. Их можно там сделать (например, http://bstring.sourceforge.net).
3. strcat — любимая функция маляра Шлемиэля.
До последнего не верил в пирамиду Лебедева.
Re[3]: сложение строк
От: remark Россия http://www.1024cores.net/
Дата: 09.03.08 23:48
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Да, но к сожалению, если в этом месте будет ошибка вроде:


I>
I>sprintf("%s%s", s1, s2, s3);
I>


I>, то немаловероятно, что компилятор ее не заметит.



Как ни прискорбно это признавать С++ программисту, но семейство С printf функций с практической точки зрения является типобезопасным. Фактически не менее типобезопасно, чем С++ streams.
И gcc, и Intel C++, и Comeau умеют проверять количество и типы аргументов, передаваемых в printf функции. Так же это умеет проверять семейство провершиков Lint (Lint, LCLint, PC-lint, Flexelint). MSVC++ умеет только выборочно проверять типы, хотя не удивлюсь, есть MSVC2008 Team Edition уже умеет это делать в полном объёме.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: сложение строк
От: remark Россия http://www.1024cores.net/
Дата: 10.03.08 03:17
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>3. strcat — любимая функция маляра Шлемиэля.



Забавно, что конец новой строки в strcat скорее всего есть и возвращать его не составило бы никакого труда.
Но! Эта возможность принесена в жертву возможности такой записи:
    printf(strcat(strcpy(malloc(strlen(s1)+strlen(s2)+1),s1),s2));

Разьве можно было упустить возможность дать людям писать такой код?


з.ы. если кто не в курсе про Шлемиэля отсюда:
http://russian.joelonsoftware.com/Articles/BacktoBasics.html


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: сложение строк
От: Roman Odaisky Украина  
Дата: 10.03.08 09:01
Оценка:
Здравствуйте, remark, Вы писали:

R>Забавно, что конец новой строки в strcat скорее всего есть и возвращать его не составило бы никакого труда.


Для этого на некоторых системах есть stpcpy, которая заменяет и strcpy, и strcat.

R>Но! Эта возможность принесена в жертву возможности такой записи:

R>
R>    printf(strcat(strcpy(malloc(strlen(s1)+strlen(s2)+1),s1),s2));
R>

R>Разьве можно было упустить возможность дать людям писать такой код?

Иногда полезно.

R>з.ы. если кто не в курсе про Шлемиэля отсюда:

R>http://russian.joelonsoftware.com/Articles/BacktoBasics.html

Не оттуда, а отсюда: http://www.joelonsoftware.com/articles/fog0000000319.html

R>


Переходи на Java. Там полная спецификация наверняка еще больше, чем C++09:

До последнего не верил в пирамиду Лебедева.
Re[4]: сложение строк
От: Roman Odaisky Украина  
Дата: 10.03.08 09:03
Оценка:
Здравствуйте, remark, Вы писали:

R>Как ни прискорбно это признавать С++ программисту, но семейство С printf функций с практической точки зрения является типобезопасным. Фактически не менее типобезопасно, чем С++ streams.

R>И gcc, и Intel C++, и Comeau умеют проверять количество и типы аргументов, передаваемых в printf функции. Так же это умеет проверять семейство провершиков Lint (Lint, LCLint, PC-lint, Flexelint). MSVC++ умеет только выборочно проверять типы, хотя не удивлюсь, есть MSVC2008 Team Edition уже умеет это делать в полном объёме.

А теперь строка форматирования приезжает из ресурсов. А теперь нужно вывести, например, boost::math::quaternion.
До последнего не верил в пирамиду Лебедева.
Re[4]: сложение строк
От: igna Россия  
Дата: 10.03.08 09:37
Оценка:
Здравствуйте, remark, Вы писали:

R>И gcc, и Intel C++, и Comeau умеют проверять количество и типы аргументов, передаваемых в printf функции.



#include <stdio.h>

void f(char *s1, char *s2, char *s3)
{
    sprintf("%s%s", s1, s2, s3);
}


Comeau C/C++ 4.3.9 Online C99 : Compile succeeded и никаких warnings.
Re[4]: сложение строк
От: igna Россия  
Дата: 10.03.08 09:46
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Думаю, что заметит. Он скажет "Cannot convert from 'const char*' to 'char*'"


"%s%s" имеет тип array of 5 const char, но неявно приводится не только к pointer to const char, но и к pointer to char:

4.2 Array-to-pointer conversion
. . .
2 A string literal (2.13.4) that is not a wide string literal can be converted to an rvalue of type “pointer to
char”; a wide string literal can be converted to an rvalue of type “pointer to wchar_t”. In either case,
the result is a pointer to the first element of the array. This conversion is considered only when there is an
explicit appropriate pointer target type, and not when there is a general need to convert from an lvalue to an
rvalue. [Note: this conversion is deprecated. See Annex D. ] For the purpose of ranking in overload resolution
(13.3.3.1.1), this conversion is considered an array-to-pointer conversion followed by a qualification
conversion (4.4). [Example: "abc" is converted to “pointer to const char” as an array-to-pointer conversion,
and then to “pointer to char” as a qualification conversion. ]

Re[5]: сложение строк
От: remark Россия http://www.1024cores.net/
Дата: 10.03.08 10:32
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, remark, Вы писали:


R>>Как ни прискорбно это признавать С++ программисту, но семейство С printf функций с практической точки зрения является типобезопасным. Фактически не менее типобезопасно, чем С++ streams.

R>>И gcc, и Intel C++, и Comeau умеют проверять количество и типы аргументов, передаваемых в printf функции. Так же это умеет проверять семейство провершиков Lint (Lint, LCLint, PC-lint, Flexelint). MSVC++ умеет только выборочно проверять типы, хотя не удивлюсь, есть MSVC2008 Team Edition уже умеет это делать в полном объёме.

RO>А теперь строка форматирования приезжает из ресурсов.


Если строка откуда-то приезжает, то частично это можно победить:

char const* translate(char const* fmt) __attribute__((format_arg(1)));
int main()
{
    printf(translate("%s"), 1);
}


Но с ресурсами это правда не поможет.

RO>А теперь нужно вывести, например, boost::math::quaternion.


Я думаю, что все компиляторы должны ругаться на попытку передать пользовательский объект в ellipsis...


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: сложение строк
От: remark Россия http://www.1024cores.net/
Дата: 10.03.08 10:45
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, remark, Вы писали:


R>>И gcc, и Intel C++, и Comeau умеют проверять количество и типы аргументов, передаваемых в printf функции.



I>
I>#include <stdio.h>

I>void f(char *s1, char *s2, char *s3)
I>{
I>    sprintf("%s%s", s1, s2, s3);
I>}
I>


I>Comeau C/C++ 4.3.9 Online C99 : Compile succeeded и никаких warnings.


Да... действительно... он только printf проверяет.
Но хорошая новость относительно статической проверки программы заключается в том, что достаточно, что бы хотя бы один компилятор отлавливал каждый тип ошибки. С этой целью полезно поднять сборку проекта на сервере автосборки под cygwin/mingw, даже если вся работа ведётся под msvc++.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: сложение строк
От: remark Россия http://www.1024cores.net/
Дата: 10.03.08 10:49
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, remark, Вы писали:


R>>Забавно, что конец новой строки в strcat скорее всего есть и возвращать его не составило бы никакого труда.


RO>Для этого на некоторых системах есть stpcpy, которая заменяет и strcpy, и strcat.


R>>Но! Эта возможность принесена в жертву возможности такой записи:

R>>
R>>    printf(strcat(strcpy(malloc(strlen(s1)+strlen(s2)+1),s1),s2));
R>>

R>>Разьве можно было упустить возможность дать людям писать такой код?

RO>Иногда полезно.


Именно

R>>з.ы. если кто не в курсе про Шлемиэля отсюда:

R>>http://russian.joelonsoftware.com/Articles/BacktoBasics.html

RO>Не оттуда, а отсюда: http://www.joelonsoftware.com/articles/fog0000000319.html


Тогда уж отсюда:
http://www.amazon.com/Joel-Software-Occasionally-Developers-Designers/dp/1590593898/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1205145997&amp;sr=8-1

У него, кстати, не так давно новая книга вышла:
http://www.amazon.com/Smart-Gets-Things-Done-Technical/dp/1590598385/ref=pd_bbs_sr_3?ie=UTF8&amp;s=books&amp;qid=1205145997&amp;sr=8-3

R>>


RO>Переходи на Java. Там полная спецификация наверняка еще больше, чем C++09:


RO>


У Java AFAIK спецификация маленькая, а всё остальное неявно implementation-defined


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: сложение строк
От: Roman Odaisky Украина  
Дата: 10.03.08 12:26
Оценка:
Здравствуйте, remark, Вы писали:

RO>>А теперь нужно вывести, например, boost::math::quaternion.

R>Я думаю, что все компиляторы должны ругаться на попытку передать пользовательский объект в ellipsis...

Я к тому, что в printf его вообще нельзя нормально вывести, а в std::ostream легко.
До последнего не верил в пирамиду Лебедева.
Re[7]: сложение строк
От: remark Россия http://www.1024cores.net/
Дата: 10.03.08 12:51
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, remark, Вы писали:


RO>>>А теперь нужно вывести, например, boost::math::quaternion.

R>>Я думаю, что все компиляторы должны ругаться на попытку передать пользовательский объект в ellipsis...

RO>Я к тому, что в printf его вообще нельзя нормально вывести, а в std::ostream легко.


Ну это уже отдельная проблема. Если программист повсеместно использует printf, то я думаю он имеет какие-то отработанные решения для этой проблемы.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: сложение строк
От: dmitry_npi Россия  
Дата: 11.03.08 13:17
Оценка:
Здравствуйте, igna, Вы писали:

I>"%s%s" имеет тип array of 5 const char, но неявно приводится не только к pointer to const char, но и к pointer to char:


Конечно, вы правы. Что-то я забыл о том, что функции с аргументами типа char* прекрасно принимают и строковые константы. Кажется, это было сделано для совместимости с С?
Атмосферная музыка — www.aventuel.net
Re[3]: сложение строк
От: dr.Chaos Россия Украшения HandMade
Дата: 22.03.08 13:54
Оценка: :)
Plague wrote:

> Тогда уж сразу так :

>
> char *sum = strcat(strcpy(malloc(strlen(s1)+strlen(s2)+1), s1), s2);
> printf(sum);
> free(sum);
>


Теперь только в point-free стиле переписать осталось .
Posted via RSDN NNTP Server 2.1 beta
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[2]: сложение строк
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 24.03.08 08:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>
B>char *s1 = "abc";
B>char *s2 = "def";
B>char *s3 = (char*)malloc(strlen(s1) + strlen(s2) + 1);
B>sprintf(s3, "%s%s", s1, s2);
B>free(s3);
B>


К слову, если вам хочется краткости и выразительности, а портабельность не нужна, то можно использовать asprintf():

char *s1 = "abc";
char *s2 = "def";
char *result;

asprintf(&result, "%s%s", s1, s2);
/* используем result */
free(result);


Только вот она

CONFORMING TO
These functions are GNU extensions, not in C or POSIX. They are also
available under *BSD. The FreeBSD implementation sets strp to NULL on
error.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.