【问题标题】:How to read from input until newline is found using scanf()?如何使用scanf()从输入中读取直到找到换行符?
【发布时间】:2011-11-11 17:21:08
【问题描述】:

当我应该从输入中读取直到有空格,然后直到用户按下回车键时,我被要求在 C 中做一项工作。 如果我这样做:

scanf("%2000s %2000s", a, b);

它将遵循第一条规则,而不是第二条。
如果我写:

我很聪明

我得到的相当于:
a = "我";
b = "我";
但应该是:
a = "我";
b = "我很聪明";

我已经试过了:

scanf("%2000s %2000[^\n]\n", a, b);

scanf("%2000s %2000[^\0]\0", a, b);

在第一个中,它等待用户按 Ctrl+D (发送 EOF),这不是我想要的。 在第二个中,它不会编译。根据编译器:

警告:“%[”格式没有关闭“]”

有什么好办法解决吗?

【问题讨论】:

  • 为什么不使用gets();并从那里操作返回的字符串?
  • 听起来像家庭作业?如果分配要求您不读取字符串然后解析它,您可能想查看getc()
  • @brianroach 请不要让 cmet 的性质“看起来像家庭作业”。它没有生产力。

标签: c format scanf


【解决方案1】:

scanf(和表兄弟)有一个稍微奇怪的特征:格式字符串中(大多数放置在)中的空白与输入中的任意数量的空白匹配。碰巧的是,至少在默认的“C”语言环境中,换行符被归类为空白。

这意味着尾随的 '\n' 不仅试图匹配 a 换行符,还试图匹配任何后续的空白。在您发出输入结束信号或输入一些非空白字符之前,它不会被视为匹配。

一种处理方法是这样的:

scanf("%2000s %2000[^\n]%c", a, b, c);

if (c=='\n')
    // we read the whole line
else
    // the rest of the line was more than 2000 characters long. `c` contains a 
    // character from the input, and there's potentially more after that as well.

根据具体情况,您可能还需要检查来自scanf 的返回值,它会告诉您成功的转换次数。在这种情况下,您将寻找 3 来指示所有转换都成功。

【讨论】:

  • 这更像!现在我懂了。我不知道规范中关于空白字符的那部分。谢谢,这就是我真正需要的。此外,thnx 为 %c 提示,它将对其他用途有用。
  • '在扫描集之外'是不够的:%c 和 %n 也是例外
【解决方案2】:
scanf("%2000s %2000[^\n]", a, b);

【讨论】:

    【解决方案3】:

    使用 getchar 和类似这样的一段时间

    while(x = getchar())
    {   
        if(x == '\n'||x == '\0')
           do what you need when space or return is detected
        else
            mystring.append(x)
    }
    

    对不起,如果我写了一个伪代码,但我有一段时间不使用 C 语言。

    【讨论】:

    • 现在我明白你的意思了。仍然......我认为这有点像使可以更简单的东西复杂化。不过,这行得通。
    【解决方案4】:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    
    int main(void)
    {
      int i = 0;
      char *a = (char *) malloc(sizeof(char) * 1024);
      while (1) {
        scanf("%c", &a[i]);
        if (a[i] == '\n') {
          break;
        }
        else {
          i++;
        }
      }
      a[i] = '\0';
      i = 0;
      printf("\n");
      while (a[i] != '\0') {
        printf("%c", a[i]);
        i++;
      }
      free(a);
      getch();
      return 0;
    }
    

    【讨论】:

    • 解决方案为何如此复杂?为什么要做这么多不必要的操作?
    • 是的 brunoais 你说得有道理!在我的代码中,我正在逐个字符地阅读,这证明了“直到”这个问题是合理的,也有很好的优化方法。但对于开始编码的人。我的解决方案将是一个很好的例子来说明事情是如何运作的。
    • @Bharadwaj_Turlapati 包括 并使用 getch() 并不是一件好事。也许有人没有在 Windows 上开发或学习。
    【解决方案5】:

    我来晚了,不过你也可以试试这个方法。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int i=0, j=0, arr[100];
        char temp;
        while(scanf("%d%c", &arr[i], &temp)){
            i++;
            if(temp=='\n'){
                break;
            }
        }
        for(j=0; j<i; j++) {
            printf("%d ", arr[j]);
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案6】:

      听起来像是一道作业题。 scanf() 是用于解决问题的错误函数。我推荐 getchar() 或 getch()。

      注意:我故意不解决问题,因为这看起来像是家庭作业,而只是为您指明正确的方向。

      【讨论】:

      • "注意:我故意不解决问题,因为这看起来像是家庭作业,而只是为您指明正确的方向。"是的,这就是我想要的。
      • 实际上,scanf 完全按照我的意愿完成了这项工作。这只是 \n 作为最后一个字符的问题。它消耗了超过 1 个字符。
      【解决方案7】:
      #include <stdio.h>
      int main()
      {
          char a[5],b[10];
          scanf("%2000s %2000[^\n]s",a,b);
          printf("a=%s b=%s",a,b);
      }
      

      只需写 s 代替 \n :)

      【讨论】:

      • s 在这里也没有意义。 %[^\n] 已经要求输入除换行符以外的所有字符。
      【解决方案8】:

      //如果你想要更多的没有,增加 char 数组的大小。字符数。

      #include <stdio.h>
      int main()
      {
          char s[10],s1[10];
          scanf("\n");//imp for below statement to work
          scanf("%[^\n]%c",s);//to take input till the you click enter
          scanf("%s",s1);//to take input till a space
          printf("%s",s);
          printf("%s",s1);
          return 0;
      }
      

      【讨论】:

      • 在您的示例中,您忽略了输入直到新行,您没有进行安全检查,s 将始终为\n。请参阅接受的答案以获取示例答案。
      猜你喜欢
      • 2012-08-28
      • 2015-10-09
      • 2022-01-25
      • 2015-07-06
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      相关资源
      最近更新 更多