【问题标题】:How to scanf one string, a pipe, and then another string all without any break/space in between?如何扫描一个字符串,一个管道,然后是另一个字符串,两者之间没有任何中断/空格?
【发布时间】:2017-08-11 09:23:21
【问题描述】:

用户会进入总线的配置,像这样

2
OO|XO
XX|XX

在哪里

  • 第一行的数字(let n)表示行数,

  • 以下 n 行显示一对两个座位

  • 中间有一条人行道,用 | 表示,一个管道。

  • 座位可以被占用也可以是空的。 O 表示空座位;一个被X占据的。


char str1[3], str2[3];

我把每对座位都当作一个字符串,

char pipe;

和管道作为一个字符。

我试过这样做:

scanf("%s %*c %s", str1, pipe, str2);

还有这个:

scanf("%s", str1);
pipe = getchar();
scanf("%s", str2);

但还是没有运气。

问题是:如何一次输入两个/多个字符/字符串而不用任何类型的空格或中断分隔它们?

【问题讨论】:

标签: c string input scanf


【解决方案1】:

scanf 允许您指定您希望使用的任何分隔符,包括管道。由于管道始终存在,因此您无需将其扫描到程序中,而是指示scanf 跳过它:

char a[3], b[3];
scanf("%2s|%2s", a, b);
printf("'%s' '%s'", a, b);

Demo.

【讨论】:

    【解决方案2】:

    首先,读取%s 转换说明符的属性。输入由空格分隔,而不是由管道 | 分隔,至少不是自动分隔。

    最简单的解决方法是,使用 maximum field width,类似

    scanf("%2s%*c%2s", str1, str2);  // the * in %*<CS> indicates assignment suppression,
                                     // you don't need a corresponding argument at all, and
                                     // a wrong one will cause trouble
    

    这里,如果您想选择不同的分隔符,则无需修改代码,它会将任何东西视为分隔符。如果要强制使用|,可以写

    scanf("%2s|%2s", str1, str2);     
    

    注意 - 永远不要忘记检查scanf() 的返回值以确保成功。

    【讨论】:

      【解决方案3】:

      有两种不同的方法可以解决您的问题:

      • 如果字符串长度是固定的,您可以指定%s 读取的最大字符数并使用此代码:

        char str1[3], str2[3];
        if (scanf("%2s|%2s", str1, str2) == 2) {
            /* read 2 characters into str1, a pipe and 1 or 2 characters into str2 */
        }
        
      • 如果字符串长度是可变的,例如在某些行的座位数不同的飞机上,您可以使用扫描集 %[OX] 并指定要读取的字符数,以防止意外输入时潜在的缓冲区溢出。这是一个例子:

        char str1[5], str2[5];  // handle up to 4 seats on each side */
        if (scanf("%4[OX]|%4[OX]", str1, str2) == 2) {
            /* read a group of 1 to 4 `X` or `O` into str1 and str2, separated by | */
        }
        

      您可以添加另一个转换以进一步验证该行是否具有预期的格式。这是一个例子:

      #include <stdio.h>
      
      int main(void) {
          char buf[128];
          int i, n, c;
          char left[3], right[3];
      
          if (fgets(buf, sizeof buf, stdin) == NULL) {
              fprintf(stderr, "invalid format, empty file\n");
              return 1;
          }
          if (sscanf(buf, "%d %c", &n, &c) != 1 || n < 0) {
              fprintf(stderr, "invalid format, expected positive number: %s\n", buf);
              return 1;
          }
          for (i = 0; i < n; i++) {
              if (fgets(buf, sizeof buf, stdin) == NULL) {
                  fprintf(stderr, "missing %d lines\n", n - i);
                  return 1;
              }
              if (sscanf(buf, "%2[XO]|%2[XO] %c", left, right, &c) != 2) {
                  fprintf(stderr, "invalid format: %s\n", buf);
                  return 1;
              } else {
                  printf("row %d: %s | %s\n", i + 1 + (i >= 12), left, right);
              }
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 2011-02-05
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        相关资源
        最近更新 更多