使用scanf或fgets在c中获取特定用户输入和参数计数?

时间:2016-12-08 16:19:25

标签: c fgets scanf

我正在尝试使用scanffgets将用户输入到函数中。

我正在写C。

用户必须输入2(正)整数。这两者之间的差异必须是1。 我必须检查实际上是否只给出了2个参数。

该函数应返回给定整数中较小的一个,如果:

  • 给定参数计数== 2

  • 差异实际上是1

如果出现以下情况,该函数应返回-1:

  • 参数count!= 2
  • 差异是> 1

如果出现以下情况,该函数应返回-2

  • 两个给定的参数具有相同的值

我没有问题比较整数和返回正确的值,我的问题是输入。 到目前为止,我尝试过这种方法:

1。)

int getInput(){
  int user_input_nod_1;
  int user_input_nod_2;
  scanf("%d %d",&user_input_nod_1,&user_input_nod_2)
  (...)
}

这里的问题是我无法知道用户是否输入了2个以上的整数。

2)。

int getInput(){
  int user_input_nod_1;
  int user_input_nod_2;
  char user_input_over;
  scanf("%d %d",&user_input_nod_1,&user_input_nod_2)
  scanf("%c",&user_input_over)
  if(user_input_over != '\0'){
     return -1;
  }
  (...)
}

这里程序返回-1,如果给出两个参数更多,并且在给定两个参数时工作正常,但是如果只给出一个scanf等于第二个输入的无穷大(即使按下回车后)。用户知道如何结束流(cmd + d,...)

3。)

int getInput(){    
  char input_nods[10];

  if(fgets(input_nods, 10, stdin) != NULL)
  {
     puts(input_nods);
  }

  char input_c1;
  char input_c2;
  char input_nod_over;

  sscanf(input_nods,"%c %c %c",&input_c1, &input_c2, &input_nod_over);

  char *nod_check_1, *nod_check_2;
  int input_nod_1 = strtol(&input_c1, &nod_check_1, 10);
  int input_nod_2 = strtol(&input_c2, &nod_check_2, 10);

  if (input_nod_over != '\0' || input_nods[2] == ' ' || input_nods[2] == '\0')
  {
      return -1;
  }
}

当给定0-9范围内的整数时,这非常有效。一旦输入有两位数sscanf就会被fgets在input_nodes []中保存的空格搞乱。

有没有办法可以实现我想要的东西? 谢谢。

2 个答案:

答案 0 :(得分:1)

我现在使用这个循环实现了它:

int user_input_nod_1;
int user_input_nod_2;

char buf[BUFSIZ], junk[BUFSIZ];

fprintf( stderr, "> " );              
while ( fgets( buf, sizeof(buf), stdin ) != NULL )
{
    if ( sscanf( buf, "%i%i%[^\n]", &user_input_nod_1, &user_input_nod_2, junk ) == 2 )
        break;
    fprintf( stderr, "[ERR] \n" );
    fprintf( stderr, "> " );
}

(使用“>”作为某种光标......)

答案 1 :(得分:0)

第三种方式,您可以使用input_nod_1input_nod_2,并且根本不使用sscanf功能。

首次使用strtol时,您必须检查nod_check_1是否为空(如果您想要更具体,则需要空格),在第二次使用时,您必须检查{ {1}}是nod_check_2

但是,我会将NULL用作long结果(为了避免长 - > int铸造溢出),并在strtol的情况下检查errno返回0。