Функции с переменным числом параметров!!!!
//с переменным числом параметров у функции...и вобщем следующее...
//возникает проблема, смотрите:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
char *concat(char *s, ...){
char *arg, *ret = s;
va_list ap;
va_start(ap, s);
while((arg = va_arg(ap, char*)) != NULL)
strcat(ret, arg);
va_end(ap);
return (ret);
}
void main(void)
{
// 1...после работы функции concat(s3, s2, s1) она возвратит строку "What a fuck?",
//но(!!!!) почему-то эту строку в программе использовать я не могу
// и printf() выведет на экран только " fuck?"
char *s1="fuck?", *s2="a ", *s3="What ";
printf("%s\n", concat(s3, s2, s1, NULL));
// 2...после работы функции concat(str1, str2, str3) она возвратит строку
//"What a fuck?" и её можно будет использовать в программе, а printf() выведет на экран
//полностью строку "What a fuck?"
char *str1="What ", *str2="a ", *str3="fuck?";
printf("%s\n", concat(str1, str2, str3, NULL));
// 3...Все работает нормально без глюков.
printf("%s\n", concat("What ", "a ", "fuck?", NULL));
}
//ВОБЩЕМ МНЕ НУЖНО ВЫЗЫВАТЬ ФУНКЦИЮ concat() с переменными а не с указанием сразу в
//функцию значений....оьясните в чем глюк!!!
//Спасибо!
намного круче и проще
А проблема тут с фунцией printf она с пробелами бока порит.
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
///ВОТ И ВСЕ!!!!!!!
#include<iostream.h>
///ВОТ И ВСЕ!!!!!!!
char *concat(char *s, ...){
char *arg, *ret = s;
va_list ap;
va_start(ap, s);
while((arg = va_arg(ap, char*)) != NULL)
strcat(ret, arg);
va_end(ap);
return (ret);
}
void main(void)
{
char *s1="fuck?", *s2="a ", *s3="What ";
///ВОТ И ВСЕ!!!!!!!
cout << concat(s3, s2, s1, NULL);
//printf("%s\n",S);
///ВОТ И ВСЕ!!!!!!!
char *str1="What ", *str2="a ", *str3="fuck?";
printf("%s\n", concat(str1, str2, str3, NULL));
printf("%s\n", concat("What ", "a ", "fuck?", NULL));
}
Под литерал "What " выделено 6 байтов памяти . И куда же функция strcat должна дописывать вторую и третью строки? Тут можно ожидать и "Access violation". Меняем порядок строк - результат меняется. Если между str1 и str2 вставить переменную - после strcat она скорее всего будет испорчена.
Перед тем, как склеивать строки, надо выделить память, достаточную для хранения всего результата.
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
char *concat(char *s, ...)
{
char *arg, *ret = s;
va_list ap;
va_start(ap, s);
while((arg = va_arg(ap, char*)) != NULL)
strcat(ret, arg);
va_end(ap);
return (ret);
}
int main()
{
char *s2="a ", *s3="What ", *s1="fuck?";
char result[20] = "";
printf("%s\n", concat(result, s3, s2, s1, NULL));
return 0;
}