c - 如何使用 getchar 监视用户输入

标签 c

我需要获取用户输入并检查它是否有效。 输入必须:

  • 空格(可以是多个)或数字开头。
  • (假设满足条件一)数字后面可能有任何类型的字符,只要我设法提取数字

数字有效值说明:

  • 可以是多位数
  • 不能为负数
  • 不能包含小数点
  • 不能是科学记数法
  • 不能是十六进制

所以我写了这个简单的获取输入的基本代码,但我不知道从哪里开始应用这些条件

    printf("Enter size of input:\n");
    int c;
    while((c=getchar())!='\n' && c!=EOF){
        printf("%c",c);
    }

例如:

  • 输入 - 4#@2311413sadokalda ;预期输出 - 4

  • 输入 - !4a ;预期输出 - 无效大小

最佳答案

你可以有如下状态机。

printf("Enter size of input:\n");
int c;
int state = 0; //0 = space, 1 = number, 2 = number read
int number = 0;
while((c=getchar())!='\n' && c!=EOF){
    switch(state)
    {
       case 0:
          if (isdigit(c))
            state = 1;
          else if (c == ' ')
            break;
          else
             //error
           break;

       case 1:
         if (isdigit(c))
         {
            number = number*10 + (c-'0');
            break;
         }
         else {
            state = 2;
         }

       case 2:
        printf ("%d\n",number);
    }
}

关于c - 如何使用 getchar 监视用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58690594/

相关文章:

c - 为什么快速排序函数中的变量 "q"在第一个过程(调用)后等于 7

c++ - SendMessageCallback 使用示例

c - a = & b vs *a = & b — 指针赋值

c - 将除\r 之外的所有字符添加到新字符串

C - 将输入的变量存储到不同的函数

c - 使用指针反转字符串而不使用字符串处理函数?

c - 关于strcpy溢出的问题

c - 为什么使用 usleep 而不是 sleep

c - 如何通过终端将段落读取为 C 中的单个字符串?

c++ - R 内部 : extracting a function pointer from an SEXP object