#c #arrays #vector
#c #массивы #вектор
Вопрос:
Я хочу создать программу, которая применяет некоторые логические элементы ( AND
, OR
, XOR
) к элементам двух массивов 1 и 0. Но у меня возникают проблемы с пользовательским вводом этих массивов. Я не знаю, как заставить массивы хранить только 1 и 0, например, если я набираю 5, я хочу, чтобы программа сообщила мне, что это ни 0, ни 1, и начала все сначала, я что-то пробовал, но это не работает:
int v1[50],v2[50],i,j,n;
printf("Number of elements in arrays : ");
scanf("%d",amp;n);
printf("Introduce elements of first array :n");
for(i=0;i<n;i )
if(v1[i] == 0 || v1[i]==1)
scanf("%d",amp;v1[i]);
else (i'll make it a function and I want it to repeat if the elements given are not 1 and 0)
for(i=0;i<n;i )
printf("%d",v1[i]);
Комментарии:
1. Добро пожаловать в Stack Exchange! Я внес несколько изменений в ваш вопрос, чтобы облегчить его поиск людям, ищущим подобную проблему в будущем. Кстати, не полагайтесь на то, что пользователь вводит число от 1 до 50 в вашей третьей строке!
Ответ №1:
В вашем первом цикле for, где вы считываете входные данные, вы должны сначала прочитать входные данные, а затем решить, хотите ли вы, чтобы пользователь попробовал ввод еще раз. Итак, первые несколько строк вашего цикла for должны выглядеть следующим образом:
for (i = 0; i < n; i ) {
scanf("%d", amp;v1[i]);
if (!(v1[i] == 0 || v1[i] == 1)) {
printf("Invalid input, please try again");
//Ask for another input, but do not advance i
}
}
Этот код сообщит пользователю, если он ввел неверный символ, но он не обновит массив правильно. Для этого все, что вам нужно сделать, это уменьшить значение i один раз. Это приведет к перезаписи предыдущего «плохого» значения v1
.
for (i = 0; i < n; i ) {
scanf("%d", amp;v1[i]);
if (!(v1[i] == 0 || v1[i] == 1)) {
printf("Invalid input, please try again");
i--;
}
}
Однако мы еще не закончили. В вашем исходном коде вы определили v1 как массив из 50 элементов. Что делать, если кто-то захочет ввести 51 элемент? В конечном итоге вы получите доступ к индексу массива, который выходит за рамки, что может привести к некоторым очень большим проблемам. Итак, вам нужно выполнить некоторое динамическое выделение памяти с помощью malloc
int *v1, i, n;
printf("How many elements will be in the bit array? ");
scanf("%d", amp;n);
//Dynamically allocate enough memory for an integer array of length n
v1 = (int *) malloc(n * sizeof(int));
Вы можете прочитать больше о malloc здесь .
Итак, весь код будет выглядеть следующим образом:
#include <stdlib.h>
#include <stdio.h>
int main() {
int *v1, i, n;
printf("How many elements will be in the bit array? ");
scanf("%d", amp;n);
//Dynamically allocate enough memory for an integer array of length n
v1 = (int *) malloc(n * sizeof(int));
printf("Input the elements of the first array (separated by newlines):n");
for (i = 0; i < n; i ) {
scanf("%d", amp;v1[i]);
if (!(v1[i] == 0 || v1[i] == 1)) {
printf("Invalid input, please try again");
i--;
}
}
Ответ №2:
Предположим, у вас есть массив, состоящий из 50 элементов:
int v1[50];
Если вы хотите заполнить его только значениями 0
, и 1
вам следует настроить while
цикл, пока пользователь не введет правильные данные:
int iter, resu<
for (iter = 0; iter < 50; iter )
{
while ((result = scanf("%d", amp;v1[iter])) != 1 // no number was found
|| (v1[iter] != 0 amp;amp; v1[iter] != 1)) // OR it was and it wasn't 0 or 1
{
if (result != 1)
scanf("%*s"); // case 1: dispose of bad input
else
printf("Please, use only values 0 or 1n"); // case 2: remind the user
}
}
}
Комментарии:
1. @The Vee Спасибо за редактирование! Я здесь всего лишь новичок и все еще борюсь с форматированием / быстрым написанием ответов для спрашивающего. Теперь мой пост показывает более четкое и информативное содержимое!
2. Не беспокойтесь 🙂 Важно содержимое. Чтобы отформатировать блок кода, вы можете поставить четыре пробела в начале каждой строки. Поскольку это большая работа, это полезно делать в редакторе исходного кода или для этого есть удобный ярлык:
Ctrl K
(лучше всего работает со всем выбранным блоком).