如何使用 getchar 监控用户输入

Posted

技术标签:

【中文标题】如何使用 getchar 监控用户输入【英文标题】:How can I monitor user input with getchar 【发布时间】:2019-11-04 09:36:52 【问题描述】:

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

space(可能是多个)或数字开头。 (假设条件一满足)数字后面可能有任何字符,只要我设法提取数字即可

数字有效值说明:

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

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

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

例如:

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

输入 - !4a ;预期输出 - Invalid Size

【问题讨论】:

您可以从检查c 的值开始。你应该在 while 条件下反转 '\n'EOF @RuudHelderman 编辑帖子以进行澄清 感谢您的编辑。显然你的意思是:一个数字是一个或多个数字的序列。请注意,这样的正式定义已经是解决方案的一半,因为它直接映射到(部分)状态机,例如 kiran Biradar 提出的状态机。 【参考方案1】:

你可以有如下状态机。

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);
    

【讨论】:

这不是有点复杂吗? strtol 或多或少会完成这项工作。 你好@Jabberwocky 我同意,我想展示 OP 常规方法。也许你可以在这一点上做出很好的回答。【参考方案2】:

你可能想要这样的东西:

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

int main(int argc, char* argv[]) 
  printf("Enter size of input:\n");

  char input[100];
  fgets(input, sizeof input, stdin);

  if (!isdigit(input[0]))
  
    printf("Invalid Size\n");
  
  else
  
    int inputsize = strtol(input, NULL, 10);
    printf("%d\n", inputsize);
  

【讨论】:

【参考方案3】:

根据您给出的问题陈述,我认为这应该会给您所需的输出

已编辑(经过一些澄清):

int main()

   int c;
   int i=0;
    while((c=getchar())!='\n' && c!=EOF)     
    
       if(isdigit(c) || (char)c==' ')   //isdigit() function check if given variable is a digit
            printf("%c",c);   
             i+=1;
        
       else
           
            break;
        
    
    if(i==0)
       printf("Invalid size"); 

【讨论】:

数字可以是多位数字,并且可以在第一位数字前以多个空格开头 @bobthebuilder 它不符合 OP 的要求。尤其是您的代码无法处理多于一位的数字。 @Jabberwocky 这是我使用此代码(多位数)时得到的输出: I/P: 345hfdgfd O/P: 345 @bobthebuilder 正式您的代码可以满足 OP 的要求,但他肯定迟早需要实际大小。而且您的代码没有得到实际大小,它只是打印数字。

以上是关于如何使用 getchar 监控用户输入的主要内容,如果未能解决你的问题,请参考以下文章

用户正在写入时 getchar()

c语言中的getch与getchar 有啥区别?

gets() 和 getchar() 还有 getch() 的区别

getch与getchar区别

常用输入输出函数总结

常用输入输出函数总结