gpt4 book ai didi

c - 如果用户输入非数字字符,如何仅扫描整数并重复读取?

转载 作者:太空狗 更新时间:2023-10-29 16:36:57 25 4
gpt4 key购买 nike

下面是一些 C 代码,试图简单地防止用户输入字符或小于 0 或大于 23 的整数。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
const char *input;
char *iPtr;
int count = 0;
int rows;

printf("Enter an integer: ");
scanf("%s", input);
rows = strtol(input, &iPtr, 0);
while( *iPtr != '\0') // Check if any character has been inserted
{
printf("Enter an integer between 1 and 23: ");
scanf("%s", input);
}
while(0 < rows && rows < 24) // check if the user input is within the boundaries
{
printf("Select an integer from 1 to 23: ");
scanf("%s", input);
}
while (count != rows)
{
/* Do some stuff */
}
return 0;
}

我做到了一半,我将不胜感激。

最佳答案

使用 scanf("%d",&rows) 代替 scanf("%s",input)

这允许您直接从 stdin 获取整数值而无需转换为 int。

如果用户输入包含非数字字符的字符串,那么您必须在下一个 scanf("%d",&rows) 之前清理您的标准输入。

您的代码可能如下所示:

#include <stdio.h>  
#include <stdlib.h>

int clean_stdin()
{
while (getchar()!='\n');
return 1;
}

int main(void)
{
int rows =0;
char c;
do
{
printf("\nEnter an integer from 1 to 23: ");

} while (((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin()) || rows<1 || rows>23);

return 0;
}

解释

1)

scanf("%d%c", &rows, &c)

这意味着期望用户输入一个整数并在其附近输入一个非数字字符。

Example1: 如果用户输入 aaddk 然后 ENTER,scanf 将返回 0。Nothing capted

示例 2: 如果用户输入 45 然后 ENTER,scanf 将返回 2(2 个元素被捕获)。这里 %d45%c\n

示例 3: 如果用户输入 45aaadd 然后 ENTER,scanf 将返回 2(2 个元素被捕获)。这里 %d45 并且 %ca

2)

(scanf("%d%c", &rows, &c)!=2 || c!='\n')

在示例 1 中: 此条件为 TRUE 因为 scanf 返回 0 (!=2 )

在示例 2 中: 此条件为 FALSE 因为 scanf 返回 2 并且 c == '\n'

在示例 3 中: 此条件为 TRUE 因为 scanf 返回 2c == 'a' (!='\n')

3)

((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())

clean_stdin() 始终为 TRUE 因为该函数始终返回 1

在示例 1 中: (scanf("%d%c", &rows, &c)!=2 || c!='\n ')TRUE 因此应检查 && 之后的条件,以便执行 clean_stdin() 并执行整个条件是 TRUE

在示例 2 中: (scanf("%d%c", &rows, &c)!=2 || c!='\n ')FALSE 所以 && 之后的条件将不会被检查(因为它的结果是整个条件将是 FALSE ) 所以 clean_stdin() 将不会被执行并且整个条件为 FALSE

在示例 3 中: (scanf("%d%c", &rows, &c)!=2 || c!='\n ')TRUE 因此应检查 && 之后的条件,以便执行 clean_stdin() 并执行整个条件是 TRUE

所以你可以注意到 clean_stdin() 只有在用户输入包含非数字字符的字符串时才会执行。

并且此条件 ((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin()) 将返回 FALSE 仅当用户输入 integer 而没有其他内容时

如果条件 ((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())FALSE 并且 integer 介于 123 之间,然后 while 循环将中断 else while 循环将继续

关于c - 如果用户输入非数字字符,如何仅扫描整数并重复读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14099473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com