Невозможно повторно инициализировать после первой инициализации значения в целочисленный массив

#c

#c

Вопрос:

Сначала я инициализирую 0 для счетчика [10], и все в порядке. Однако где-то я хочу повторно инициализировать с 0 снова, но терпит неудачу.

Сообщение об ошибке

[Warning] extended initializer lists only available with -std=c 11 or -std=gnu 11

 #include <stdio.h>
#include <stdbool.h>

int main(void) {

  int digit, counter[10] = {0}; //Declare variable "digit" to store individual number to be compared and declare an array for the input numbers
  bool rep_digits; //Declare a boolean variable to determine whether the input numbers has repetitive numbers or none
  int n; //Declare variable "n" to store the input numbers

  while (true) { //This while loop serves as a loop for the user input
    
    printf("nEnter a number (capped at  on this compiler): ");
    scanf("%d", amp;n);
    if (n == 0) { //The user input loop terminates when the user input a 0
    break;
    }
    
    printf("Repeated digits(s): n");

    while (n > 0) { //If the condition is true, execute the arguments inside
        digit = n % 10; //Obtain the remainder of the input number
        counter[digit]  ; //Increase the counter for the obtained remainder in the array
        if (counter[digit] == 2) { //If the counter of that particular remainder is equal (and only equal) to 2, print out the number
            printf("-n", digit); 
            rep_digits = true;  //Set the boolean variable to true if there is a repetitive number in the input
        }
        n /= 10; //Divide the input number by 10 to determine the next number either repetitive or not
    }
        
    counter[10] = {0}; // re-initialize to 0
        
    if (rep_digits == false) { //If the boolean variable stays false then display this message
        printf("No repeated digitsn");
    } 
  }

  return 0;
}
  

Комментарии:

1. Вы не можете этого сделать. Если вы хотите установить для всех значений значение 0, вы можете использовать цикл, или вы можете использовать memset для установки всех байтов в 0. Вы также можете переместить объявление с инициализацией внутри цикла while

Ответ №1:

counter[10] = {0}; запись за пределы размера массива вызывает неопределенное поведение.

предположим, у вас есть размер массива as int counter[10] , вы должны писать только от counter[0] till counter[9]

если вы хотите инициализировать все элементы массива 0 , вы можете сделать это двумя способами.

  1. int counter[10] = {0}; \this works only at the same place where you declare
  2. memset(counter,0,sizeof(counter)); \ this can be done at any other place in the program

В вашей программе замените counter[10] = {0}; на memset(counter,0,sizeof(counter));

это должно работать просто отлично.

Комментарии:

1. @RetiredNinja, спасибо, что раньше внимательно изучили программу, правильно обновили ответ, дав объяснение

2. Спасибо за ответ! Я искал альтернативный способ повторно инициализировать элементы моего массива до 0 без повторного объявления. Вы также указали на мою глупую ошибку, что после объявления массива «counter [10] = {0}», где 10 на самом деле является индексом, а не размером массива.

3. @BrandonJ, голосование — единственный способ поблагодарить вас здесь 🙂

4. Я попытался проголосовать за ваш ответ и проверить его, но я все еще новичок в stackoverflow, он говорит, что мне нужно больше репутации

5. Я думаю, что под опцией голосования «Против» есть возможность принять в качестве ответа, на который вы можете нажать

Ответ №2:

Вместо использования int counter[10] = {0}

Используйте memset int counter[10]; memset(counter,0,sizeof(counter));

Приведенная выше строка memset заполняет каждое значение массива counter равным 0.

Комментарии:

1. Стоит отметить, что memset это работает с байтами, а не с целыми числами, поэтому замените это 0 на a 1 , и результатом не будет массив значений, равный 1.