【问题标题】:How to exit the scanf function if a specific value is entered?如果输入特定值,如何退出 scanf 函数?
【发布时间】:2020-12-03 03:24:41
【问题描述】:

我希望 scanf 读取一些数据并将其存储到多个变量中。但是,如果第一个变量,即数量为 0,则 scanf 需要退出询问用户输入,因为我的后续 while 循环取决于该值,即数量。如果值不为零,则继续循环并做进一步的工作,否则不要。

#include <stdio.h>

struct inventory {

    int quantity, category;
    double price, soldByWeight;
    char name[20];
};

void main(void) {

    struct inventory arr[5] = { 0 };

    printf("Enter values: \n");

    for (int i = 0; i < 5; i++) {

        scanf("%d%*c%d%*c%lf%*c%lf%*c%19[^\n]", &arr[i].quantity, &arr[i].category, &arr[i].price, &arr[i].soldByWeight, arr[i].name);

        /*while (arr[i].quantity != 0) {

            do some stuff 
        }*/
    }
    return 0;
}

样本输入 1:21,1,1.5,1,potato

样本输入 2:0

在示例输入 2 之后,如果我输入 0 并按 enter 键,scanf 仍在等待用户输入。输入 0 和回车键后如何退出 scanf 功能。 %*c 用于刷新示例输入中使用的逗号。

【问题讨论】:

    标签: c


    【解决方案1】:

    首先我建议你把read whole lines of input变成一个字符串。

    然后使用sscanf解析字符串,总是勾选what it returns

    最后,如果sscanf 返回1 然后检查arr[i].quantity 看它的值是否为零。

    作为替代方案,您还可以使用例如预检查输入 0(在调用 sscanf 之前)。 strtol.

    【讨论】:

      【解决方案2】:

      您可以使用fgets 阅读整行内容。如果该行仅包含 0,则退出 for 循环。否则,使用 sscanf 解析字段。

      #include <stdio.h>
      
      struct inventory {
      
          int quantity, category;
          double price, soldByWeight;
          char name[20];
      };
      
      int main() {
          struct inventory arr[5] = { 0 };
      
          char buf[2048];
      
          printf("Enter values: \n");
      
          for (int i = 0; i < 5; i++) {
      
              fgets(buf, sizeof(buf), stdin);
              if ((buf[0] == '0') && ((buf[1] == '\n') || ((buf[1] == '\r') && (buf[2] == '\n')))) {
                  break;
              }
      
              sscanf(buf, "%d,%d,%lf,%lf,%19[^\n]", &arr[i].quantity, &arr[i].category, &arr[i].price, &arr[i].soldByWeight, arr[i].name);
              printf("%d %d %lf %lf %s\n", arr[i].quantity, arr[i].category, arr[i].price, arr[i].soldByWeight, arr[i].name);
          }
          return 0;
      }
      

      【讨论】:

      • 我对您的解决方案有疑问,我忘记提及了。我的输入之一是一个由空格分隔的字符串,但是,当我们使用 sscanf 中的 %s 来解析输入到名称数组时,它会丢弃空格后的所有内容,因为 %s 有空格限制.关于如何处理 char name[20] 字符串中的空格的任何想法。样本输入:2,3,9.5,1,意大利香肠
      • 示例输入:2,3,9.5,1,Italian sausage ---->这里需要处理Italian后面的空格
      • 示例输入:2,3,9.5,1, Italian sausage ------>这里需要去掉意大利语前面的空格
      • 好的。我已经更新了上面的答案以处理名称中的空间。
      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多