ArvindSai Ответов: 1

Почему он превращается в бесконечный цикл, если я даю значение char в качестве входных данных вместо int?


#include "stdafx.h"
#include<stdio.h>


int main()
{
	unsigned int  i, k = 0, l = 0, m = 0, j = 1;
	int x;
	do
	{
		printf("\nEnter the number of elements you want to enter (MAX VALUE 100) : ");
		scanf_s("%d,", &x);
		if (x >= 0&&x<=100)
		{
			int a[100];
			for (i = 1; i <= x; i++)
			{
				printf("\nEnter the %d element : ", i);
				scanf_s("%d", &a[i]);
				if (a[i] > 0)
					++k;
				if (a[i] < 0)
					++l;
				if (a[i] == 0)
					++m;
				j++;
			}
		}
		else
			printf("\nInvalid entry");
	} while (j <= 1);
		printf("\nNo of Positive numbers are : %d\nNo of Negative numbers are : %d\nNo of zeros are : %d\n", k, l, m);
	

	return 0;
}

Приведенная выше программа просто подсчитывает количество положительных, отрицательных и нулевых чисел в последовательности чисел, введенных пользователем. Я поставил небольшую проверку с помощью do while loop, является ли максимальный диапазон, заданный пользователем, допустимым числом или нет, но что делать, если пользователь вводит символ или специальный символ(ну, я сам пробовал, это оказывается бесконечный цикл), Как выполнить проверку для него, чтобы избежать попадания программы в бесконечный цикл, а также я хочу знать, почему он входит в бесконечный цикл при вводе символа или символа.

Что я уже пробовал:

Я пробовал вводить символ/символ в качестве входного сигнала, он дает выход, как следующие бесконечные времена.
Введите количество элементов, которые вы хотите ввести: $
Недействительная запись
Введите количество элементов, которые вы хотите ввести :
Недействительная запись
Введите количество элементов, которые вы хотите ввести :
Недействительная запись
.
.
СТРЕМИТСЯ К БЕСКОНЕЧНОСТИ

1 Ответов

Рейтинг:
11

Graeme_Grant

j никогда не меньше 1, поэтому цикл не выйдет. j только увеличивается: j++.

Спросите себя: "как пользователь говорит мне, что они закончили?".

Вместо того чтобы вычислять по ходу дела, было бы лучше сделать это после того, как пользователь завершит ввод своего номера.

[Редактировать:] Вот псевдокод, чтобы делать то, что вы хотите:

do
{
    /* 1. get user input
     * 2. test input:
     *     if {exit loop marker} then break
     *     if {invalid value} then warn
     *     else add value to array
     */
}
for {start; test max; increment}
{
    /* if isPositive, inc positive count
     * if isNegative, inc negative count
     * else inc zero count
     */
}
// report counts back to user

Этого должно быть достаточно, чтобы помочь вам написать свой код.

СОВЕТ: используйте имена переменных, которые представляют то, что содержат значения. Сделайте код на 1000% более читабельным.


ArvindSai

спасибо,
но одна последняя вещь.
скажем, что я ввел символ, так как он недействителен, он печатает "недопустимая запись", а затем снова запускает выполнение с начала (без увеличения значения j, конечно)цикла, печатая " введите количество элементов, которые вы хотите ввести (максимальное значение 100):", а затем после того, почему он не приостанавливает выполнение для ввода пользователя, так как следующая инструкция scanf_s?

Graeme_Grant

Я опубликовал обновление своего первоначального ответа с требуемой логикой. Я оставлю фактическое кодирование на ваше усмотрение.