【发布时间】:2018-11-22 20:49:56
【问题描述】:
所以我要求自己编写一个函数,即:
- 用安全值覆盖 int(如果 用户决定输入 char-s 或任何更大的绝对值 比 (2^31-1)
- 如果输入超过 (2^31 - 1)(意味着如果用户输入 8 个或更多 数字) int 必须被上限值覆盖
代码如下:
void getSafeIntWithBoundaries(int *dest, int lo, int hi, const char *message);
bool anyChars(const char *input, int len);
int main() {
int x;
getSafeIntWithBoundaries(&x, 1, 10, "Enter an integer between 0 and 10.");
printf("x = %d\n", x);
return 0;
}
void getSafeIntWithBoundaries(int * dest, int lo, int hi, const char * message) {
char input[33];
while (1) {
puts(message);
fgets(input, 33, stdin);
int len = strlen(input);
if (input[len - 1] == '\n') { input[len - 1] = '\0'; }
--len;
if (bool reset = anyChars(input, len)) {
puts("Try again.");
continue;
}
else {
int ret;
if (strcmp("2147483648", input) < 0) {
*dest = hi;
return;
}
sscanf(input, "%d", &ret);
ret = ret > hi ? hi : ret;
ret = ret < lo ? lo : ret;
*dest = ret;
break;
}
}
}
bool anyChars(const char * input, int len) {
for(int i = 0; i < len; i++) {
if (!isdigit(input[i])) {
return true;
}
}
return false;
}
还有一些注意事项:
- 在
getSafeIntWithBoundaries(...)我正在摆脱'\n',我是 将其更改为'\0',分别减少int len;输入的长度。 -
anyChars()检查输入是否包含任何非数字char。如果 确实如此,然后用户必须重新输入。 其中一个问题是 但是,在失败的情况下,只需要打印消息 一次。如果我输入了很长的内容,将打印消息 多次。我不知道如何解决这个问题。 - strcmp() 位检查用户输入的数字是否大于 (2^31 - 1)。如果用户有,那么 int 必须被覆盖 高值和功能需要结束。 但问题是,如果 用户输入一个很长的数字,目标 int 将是 被低边界覆盖。我不知道如何解决这个问题 要么。
-
2 s 确保目标 int 不会超出其边界。我标记了 我用粗体无法弄清楚的部分,本质上就是 整个问题。
也欢迎提出改进代码的建议。
【问题讨论】:
-
你有什么问题?
-
以粗体标记的内容。
-
如果每一个都是一个问题,那么请专注于一个问题。但事实上,这些似乎都不是问题。整个帖子更多的是您想要匹配的要求列表。同样,您有什么与编程相关的特定问题?您想要更改代码的一件事是什么?您显示的代码如何不按预期运行?
-
这似乎不是 C。
-
好吧,@EOF 看起来怎么样?
标签: c