Начал изучать си (в вузе надо), но никак не могу сделать проверку ввода. Нужно сделать так, чтобы программа принимала только числа, можно отрицательные и дробные. Например -7,567. Но не чтобы не принимало остальной, типа "цуенра56,67,32" Буду рад, если кто-нибудь напишет мне эту функцию. Заранее спасибо нужно через scant и printf.
Добавлено (20 Сентября 2014, 14:05:19) --------------------------------------------- *но чтобы не принимало... Опечатался
А вообще, просто циклом по каждому символу проходишься. Потом проверка (if), если этот символ не цифра, не знак минуса или не запятая/точка, то пишешь что все херня давай по новой (не число); если встретил запятую - какой-нить счетчик там сделай тру, чтобы если второй раз запятая встречается (еще одно условие уже внутри первого условия) то тоже писало что все херня и это не число. И если все херня, то сразу заканчиваешь обработку и пишешь что не число.
Код
int CHECKIFANUMBER (char * s) { int counter = 0, i; for (i = 0; i < strlen(s); i++) { if ((s[i] >= '0' && s[i] <= '9') || s[i] == ',' || s[i] == '.' || s[i] == '-') { if (s[i] == '-' && i != 0) { printf("VSE HERNYA DAVAY PO NOVOY (minus ne v nachale)"); return 0; } if ((s[i] == ',' || s[i] == '.') && counter == 0) { counter++; } else if (s[i] == ',' || s[i] == '.') { printf("VSE HERNYA DAVAY PO NOVOY (2 tochki)"); return 0; } } else { printf("VSE HERNYA DAVAY PO NOVOY (wrong symbol detected)"); return 0; } }
return 1; }
Вот так, например. Функция берет массив чара, то бишь строчку, и возвращает инт (0 = этот массив символов не число, 1 = это число). Хз мб не работает, писал на коленке в блокноте. Но вроде должно.
Сообщение отредактировал BinGO - Суббота, 20 Сентября 2014, 22:00:54
О, а у меня еще минус посреди числа может быть, между делом А, ну и да, там надо условие в условии делать при таком подходе, я чето вообще чушь написал. Да, так покороче код получился. Давно я ничего не кодил, совсем никак не пытался оптимизировать даже.
ЦитатаSirNikolas ()
Хотя подозреваю, что нужно что-то вроде
А, кстати, очень даже может быть, что это имелось в виду.
Ахаха, что-то я совсем поехал А скобки это да, может быть, в форме добавления ответа кодить не очень удобно, пропустить легко.
Добавлено (20 Сентября 2014, 21:57:39) --------------------------------------------- Вроде не перед, а после него не хватает. А то получается, что сразу при первом прогоне цикла вернет единичку.
Пожалуй, пора в блокнот скопировать и посмотреть D:
Добавлено (20 Сентября 2014, 22:00:16) --------------------------------------------- Да, действительно, теперь вижу.
Добавлено (20 Сентября 2014, 22:03:55) --------------------------------------------- Надо бы опять кодингом чего-нибудь заняться, а то совсем внимательность растерял. Нечего только кодить.
Сорь, в дороге писал Scanf офк Спасибо за помощь, гляну
Добавлено (03 Октября 2014, 13:25:17) --------------------------------------------- В общем. Снова у меня проблема Пытаюсь сделать функцию и передать ее в main
Но в итоге получаются лишь нули. Пробовал указатели ставить, но ничего в итоге не вышло, может неправильно расставил. Подскажите как реализовать это вообще... Массив почему то сканом считывает, а эти числа нет
int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "Russian"); setlocale(LC_ALL, "rus"); bool povt = false; while (povt == false) { printf("Введите размерность массива (высота и длина через пробел):\n"); int w = 0; int h = 0; int vi = 0; bool che; bool ch1; int **mas = NULL; int *sum = NULL; ch1 = false;
vvodhw(h, w);
mas = new int*[h]; sum = new int[h]; for (int i = 0; i < h; i++) { mas[i] = new int[w]; } } }
void vvodhw(int h, int w) { bool che; che = false; while (che == false) { che = scanf_s("%d %d", &h, &w); fflush(stdin); if (w < 1 || h < 1) { printf("Неверное значение, повторите ввод\n"); che = false; } } }
Сообщение отредактировал SPtrue - Пятница, 03 Октября 2014, 18:19:57
int main() { int** arr; int h, w; int i; puts("Input height and width:"); while (!InputHW(&h, &w)) puts("Invalid input, try again please:"); arr = new int*[h]; for (i = 0; i < h; i++) arr[i] = new int[w]; //... for (i = 0; i < h; i++) delete[ ] arr[i]; delete[ ] arr; }