#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
, вы можете сделать это двумя способами.
int counter[10] = {0}; \this works only at the same place where you declare
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
на a1
, и результатом не будет массив значений, равный 1.