【问题标题】:Using the Scanf function for inputs for different lengths对不同长度的输入使用 Scanf 函数
【发布时间】:2021-06-19 01:34:48
【问题描述】:

我想使用 scanf 函数从用户那里获取两个数字或一个数字的输入并将它们放入一个数组中。但是,我不确定如何使用相同的函数来获取数组的一个元素以及数组的两个元素的输入。

即如果用户输入 9 0,它应该能够成功地将它存储在一个数组中并移动到新代码,或者如果用户输入类似 1 的东西,它也应该能够成功地将它存储在数组中,然后移动到新代码。

我已经尝试将 scanf 放入 while 循环中:

int scanned_array[2] = {};
int element = 0;

while(scanf("%d", &scanned_array[element]) {
    //... more code here which will have different functions depending on the input...
    element++;
}

我怎样才能在只使用 scanf 函数、while 循环、数组和 if 语句的情况下成功地做到这一点?

**编辑: 只是想知道,如果我根据@nmgari 下面的建议更改了我的代码,我怎么能去 if(num == 1) { ... 没有按 ctrl+d?

感谢阅读!

【问题讨论】:

    标签: arrays c input scanf


    【解决方案1】:

    如果我理解正确,您想调用 scanf() 一次并读取一个或两个数字。

    这样的事情应该可以工作:

    int scanned_array[2];
    int num_input = 0;
    
    num_input = scanf("%d %d", &scanned_array[0], &scanned_array[1]); 
    
    if(num_input == 1)
    {
        //Do something
    }
    else if (num_input == 2)
    {
        //Do somethine else
    }
    

    无论如何,你需要考虑到数组中的第二个元素可能永远不会得到值。

    【讨论】:

    • 好的,谢谢!只是想知道,如果数组中的第二个元素永远不会得到一个值,你如何在不使用 control-d 的情况下让它前进到if (num_input == 1){//Do something}?
    • 此代码将强制输入 2 个输入,并且仅在第二个不是整数或文件结尾出现在第一个整数之后时才返回 1。 scanf() 直到其中之一才会返回,可能分布在多行中。
    • "%d %d" 如果输入行只有一个数字则失败,因为scanf() 将尝试读取 2 行。
    【解决方案2】:

    您应该使用fgets() 读取输入行并使用sscanf() 对其进行解析:

        char buf[120];
        if (fgets(buf, sizeof buf, stdin)) {
            int i1, i2;
            switch (sscanf(buf, "%d%d", &i1, &i2)) {
              case 2:
                /* the user entered 2 integers */
                handle_2_integers(i1, i2);
                break;
              case 1:
                /* the user entered a single integer */
                handle_1_integer(i1);
                break;
              default:
                /* the user did not enter a number */
                handle_invalid_input();
                break;
            }
        } else {
            /* the input stream is at end of file or encountered an error */
            handle_end_of_file();
        }
    

    如果您运行scanf("%d%d", &i1, &i2),scanf() 将继续读取输入流,直到文件结束,或已读取 2 个整数或已输入无法转换为整数的字符,可能会读取多行输入这些情况之一发生。如果要处理单行输入,则不能直接使用scanf()。

    【讨论】:

      【解决方案3】:

      可以使用单独的空白扫描。
      扫描集%1[ \t\r\n] 将逐个字符地捕获空白字符。循环将在非空格或换行符处退出。
      然后尝试扫描一个整数。

      #include <stdio.h>
      #include <stdlib.h>
      
      int main ( void) {
          char space[2] = "";
          int scanned = 0;
          int scanned_array[2] = { 0};
      
          while ( 1) {
              while ( 1 == scanf ( "%1[ \t\r\n]", space)) {
                  if ( '\n' == space[0]) {
                      break;
                  }
              }
              if ( '\n' == space[0]) {
                  break;
              }
              if ( 1 != scanf ( "%d", &scanned_array[scanned])) {
                  fprintf ( stderr, "bad input\n");
                  return 1;
              }
              ++scanned;
              if ( 2 <= scanned) {
                  break;
              }
          }
      
          for ( int each = 0; each < scanned; ++each) {
              printf ( "%d\n", scanned_array[each]);
          }
      
          return 0;
      }
      

      【讨论】:

      • Minor: scanf ( "%1[ \t\r\n]" ... 涵盖了最常见的空白,但不是全部。可以使用getchar(), isspace(), unget()来处理所有的WS。
      • space[] 最好在调用scanf ( "%1[ \t\r\n]",... 之前重新归零,以免继承先前的数据。注意 if ( '\n' == space[0]) 可能为真,当先前的 scanf ( "%1[ \t\r\n]... 由于罕见的输入错误而返回 EOF 时。最好不要使用'\n' == space[0],除非scanf ( "%1[ \t\r\n] ... 返回1。
      猜你喜欢
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多