Я не могу скомпилировать программу из-за переопределения

Моя программа проверяет, являются ли два слова анаграммами. У меня проблемы с установкой его значения на 0. Мне удалось решить проблему с помощью for цикл, чтобы установить все значения на 0, но я хотел бы знать, если бы я мог использовать int counts[26] = {0}; вместо этого, очевидно, не без изменений, потому что компилятор показывает ошибку:

8 C: \ Dev-Cpp \ Templates \ anagrams_functions.c 'считает', объявленный как символ другого типа

Вот код:

#include <stdio.h>
#include <ctype.h>

void read_word(int counts[26])
{
    int i;
    char ch, let[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W', 'X', 'Y', 'Z'};
    int counts[26] = {0};

    while((ch = toupper(getchar())) != '\n'){
        for(i = 0; i < 26; i++){
            if (let[i] == ch)
                counts[i]++;
        }
    }
}

int equal_array(int counts1[26], int counts2[26])
{
    int i;
    for(i = 0; i < 26; i++){
        if(counts1[i] != counts2[i])
            return 0;
        else continue;
    }
    return 1;
}

int main(void)
{
    int counts1[26] = {0};
    int counts2[26] = {0};

    printf("Enter first word: ");
    read_word(counts1);

    printf("Enter second word: ");
    read_word(counts2);

    if(equal_array(counts1, counts2))
        printf("The words are anagrams");
    else
        printf("The words are not anagrams");

    getch();
    return 0;
}

3 ответа

Решение

В функции

void read_word(int counts[26])

вы объявляете массив counts снова,

int counts[26] = {0};

Вам нужно изменить массив counts здесь под другим именем.

Читая ваш исходный код, я предлагаю вам удалить объявление counts в функции.

Вы декларируете counts дважды в этой функции, один раз как формальный аргумент и один раз как локальная переменная.

void read_word(int counts[26])
{
    /* Code */
    int counts[26] = {0};
    /* Code */
}

Есть две вещи, которые вы можете сделать, чтобы очистить counts, Во-первых, делать то, что вы делаете сейчас, чтобы вызывающий абонент очистил это:

int main(void)
{
    int counts1[26] = {0};
    int counts2[26] = {0};
    /* Code */
}

Во-вторых, чтобы вызываемый абонент был свободен counts, memset идеально подходит для этого:

void read_word(int counts[26])
{
    /* Code */
    memset(counts, 0, sizeof(counts));
    /* Code */
}

У тебя есть counts оба как read_word() параметр функции и как переменная внутри этой функции.

Другие вопросы по тегам