Вопрос
Есть проверяющая функция для моего размера, которую мне не удалось правильно кодировать
void getsize(int* size, int cap){
while(1){
printf("Enter the size(whole number) of array from interval (0, %d]: \n", cap);
if (scanf("%d", size) == 1){
if ((*size > 1) && (*size <= cap)){
printf("Size: %d entered\n", *size);
break;
} else {
printf("Invalid size. Try again.\n");
}
} else {
printf("Invalid size. Try again.\n");
break;
}
}
}
.
Что я ожидаю от пользователя, заключается в том, чтобы ввести положительное целое число.Кто-нибудь можно исправить это или показать лучшее решение для этого?Спасибо.
Решение
Ваша версия может принимать поплавковые номера с части до того, как точка представляет собой действительное целое число.Вместо этого вы можете использовать STRTOL и проверить конец номера действительно новая линия:
#include <stdio.h>
#include <stdlib.h>
void getsize(int* size, int cap){
char buffer[256], *c;
while (1) {
if (fgets(buffer, sizeof(buffer), stdin)) {
int lsize = strtol(buffer, &c, 10);
if ((lsize > 1) && (lsize <= cap) && c[0] == '\n'){
printf("Size: %d %s entered\n", lsize, c);
*size = lsize;
return;
}
}
printf("Invalid size. Try again.\n");
}
}
int main ( ) {
int size;
getsize(&size, 10);
return 0;
}
. Другие советы
Я не вижу никакого использования размера приема в качестве параметра, чтобы получить, поскольку вам нужны только пределы, которые могут быть предоставлены самим «крышкой». Для Scanf можно предоставить адрес переменной для переменных.
.void getsize(int cap){
int size;
while(1){
printf("Enter the size(whole number) of array from interval (0, %d]: \n", cap);
if (scanf("%d", &size) == 1){
if ((size > 1) && (size <= cap)){
printf("Size: %d entered\n", *size);
break;
} else {
printf("Invalid size. Try again.\n");
}
} else {
printf("Invalid size. Try again.\n");
break;
}
}
}
.