2016-04-09 2 views
0

Я пытаюсь инициализировать массивы, передавая их функции инициализации в качестве указателя. Моя программа компилируется без ошибок, но когда я ее запускаю; он распечатывает количество символов и останавливается.Функция инициализации массива: Передача массива в качестве указателя: C++

Это то, что я до сих пор:

#include<iostream> 
#include<cctype> 
#include<string> 
#include<iomanip> 

using namespace std; 

void initialize(int *array, int n, int value);  

int main() 
{ 
char ch; 
int punctuation, whitespace, digit[10], alpha[26]; 

punctuation = 0, whitespace = 0; 

initialize(digit, sizeof(digit)/sizeof(int), 0); 
initialize(alpha, sizeof(alpha)/sizeof(int), 0); 

while(cin.get(ch)) 
{ 
    if(ispunct(ch)) 
     ++punctuation; 
    else if(isspace(ch)) 
     ++whitespace; 
    else if(isdigit(ch)) 
     ++digit[ch - '0']; 
    else if(isalpha(ch)) 
    { 
     ch = toupper(ch); 
     ++alpha[ch - 'A']; 
    } 

    if(whitespace > 0) 
    { 
     cout << "Whitespace = " << whitespace << endl; 
    } 

    if(punctuation > 0) 
    { 
     cout << "Punctuation = " << punctuation << endl; 
    } 

    cout << setfill('-') << setw(17) << '-' << setfill(' ') << endl; 
    cout << " Character " << " Count " << endl; 
    cout << setfill('-') << setw(17) << '-' << setfill(' ') << endl; 


    return 0; 
} 
} 

void initialize(int *array, int n, int value) 
{ 
    int i;  

    for (i = 0; i < n; ++i) 
    { 
    value += array[i]; 
    } 
} 

Я не уверен, что я делаю что-то неправильно здесь. Хотя, я немного смущен относительно того, как работают указатели после того, как они были переданы другой функции. Может кто-нибудь объяснить?

Спасибо

+0

В функции инициализации напечатайте значение n. – MikeC

+0

"Остановки"? Висит? Сбои? Просто выходит? – hyde

+0

Он печатает количество символов, а затем выходит – Ambrus

ответ

2

Вы, вероятно, хотите
)

void initialize(int *array, int n, int value) 
{ 
    int i;  

    for (i = 0; i < n; ++i) 
    { 
    // no: value += array[i]; but: 
    array[i] = value; 
    } 
} 

смотри также std::fill

и б) переместить return 0; выключить в то время как-тела цикла

cout << " Character " << " Count " << endl; 
    cout << setfill('-') << setw(17) << '-' << setfill(' ') << endl; 
    } 
    return 0; 
} 

редактировать: о а)
Вы можете использовать

std::fill(std::begin(digit), std::end(digit), 0); 
std::fill(std::begin(alpha), std::end(alpha), 0); 

вместо вашей функции инициализации() или (учитывая контекст) просто

int punctuation, whitespace, digit[10]={0}, alpha[26]={0}; 
+0

О, ничего себе, теперь я чувствую себя действительно глупо, потому что я даже не заметил, что возвращается 0; был внутри цикла while, и способ, которым вы исправили мою функцию, - это то, как я ее первоначально использовал. Спасибо, VolkerK. – Ambrus

0

Если вы разрабатываете в C++, почему не вместо этого использовать векторы? (Работа с массивами * очень C-стиль).

vector<int> array(n, value); 

n = количество целых чисел. Значение = значение для размещения в каждой ячейке массива.

Смежные вопросы