Работа с изменяемым списком аргументов в функции
Помогите решить проблему:в колледже задали написать программу,которая требует изменяемый список аргументов char. при запуске этой функции,начиная со 2 символа,в массив передается, ровным счетом, ничего вот код:
#include <iostream>
#include <windows.h>
using namespace std;
void fun(int kol, char str, ...)
{
char* chr = &str;
int i1 = 0;
int kol1 = kol;
char* ind = new char[kol];
int* counters = new int[kol]; // Массив повторов
while(kol1--)
{
cout << "chr=" << chr<<endl;
ind[i1] = *chr;
cout << "ind[i]=" << (int)ind[i1]<<endl;
chr++;
i1++;
}
// Подсчитать кол-во повторов в массиве
for (int i = 0; i < kol; i++)
counters[i] = count(ind, ind + kol, ind[i]);
// Поиск максимума
int max = 0;
for (int i = 0; i < kol; i++)
if (counters[i] > max)
max = counters[i];
cout << "чаще всего встречается символ " << ind[max]<<endl;
delete [] ind;
delete [] counters;
}
int main()
{
SetConsoleOutputCP(1251);//корректная работа со словами из кириллицы
SetConsoleCP(1251);
fun(7, 's', 'o', 'b', 'a', 'k', 'a', '\0');
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Этот kol не нужен категорически. Есть условие завершения чтения - нулевой символ, его достаточно. А так вы можете передать в kol, скажем, 3, а символов дать 10 (или наоборот) - и что тогда делать?
void fun(char c, ...)
{
int cnt[256] = { 0 };
va_list ap;
va_start(ap,c);
while(c)
{
cnt[(unsigned char)c]++;
c = va_arg(ap,char);
}
va_end(ap);
unsigned char m = 0;
int max = 0;
for(int i = 0; i < 256; ++i)
if (cnt[i] > max)
{
max = cnt[i];
m = i;
}
printf("Count of char %c = %d\n",(char)m, max);
}
int main()
{
fun('a','b','s','d','8','s','f','y','a','a','s','s','\0');
}
Но! тут есть хитрая тонкость. Вообще говоря, char передается в функцию как int, так что если VC++ понимает
c = va_arg(ap,char);
то тот же gcc так работать не будет, ему нужно
c = va_arg(ap,int);
Кстати говоря, VC++ с int тоже отработает корректно...