【问题标题】:C: Structuring input with scanf()C: 使用 scanf() 构造输入
【发布时间】:2013-01-07 00:31:44
【问题描述】:

有没有办法控制 scanf() 分离输入的方式?

scanf("%10s %10s", array1, array2);

以上工作正常,按空格分隔。但是,我可以使用不同的分离信号吗?

因为如果我想用逗号而不是空格拼接输入,这些似乎都不起作用:

scanf("%10s,%10s", array1, array2);
scanf("%10s, %10s", array1, array2);

什么给了?我正在阅读的一本书声称可以使用任何字符将输入与 scanf() 分开,但未能解释如何做到这一点。此外,如果可以使用替代字符,是否也可以使用比单个字符更广泛的标准? (即值类型、语句等)

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    使用字符类:

    #include <stdio.h>
    
    int main(int argc, const char **argv) {
      char s1[10], s2[10];
      const char *str = "word1,word2";
      sscanf(str, "%[^,],%s", s1, s2);
      printf("%s -- %s\n", s1, s2);
      return 0;
    }
    

    或者你可以更具体:

    sscanf(str, "%[^,],%[^,]", s1, s2);
    

    这也将捕获s2中的空白

    要拆分多个字符,您可以使用strstr:

    #include <stdio.h>
    #include <string.h>
    int main(int argc, const char **argv) {
      const char *str = "word1fooword2fooword3", *foo = "foo", *ptr;
      const char *eofstr = str;
      for (ptr = str; eofstr; ptr = eofstr + strlen(foo)) {
        char word[10];
        eofstr = strstr(ptr, foo);
        if (eofstr) {
          size_t len = eofstr - ptr;
          strncpy(word, ptr, len);
          word[len] = 0;
          printf("%s\n", word);
        } else {
          strcpy(word, ptr);
          printf("%s\n", word);
        }   
      }
      return 0;
    }
    

    【讨论】:

    • 这适用于"word1, word2",而我认为它不应该(“我想用逗号而不是空格拼接输入”)。这实际上使用逗号 任意数量的空格作为分隔符,但也许我误解了这个问题。
    • @perreal ... 实验表明,使用 [^] 只允许单个字符提示拼接输入。这是真的,还是有办法使用更广泛的标准?例如,单词 'foo' 而不是 ','。
    • 正确,这只能拆分为单个字符。对于多个字符,您可以使用 strstr 和循环。
    • @perreal 我很好奇它的实现会是什么样子。如果你不想打扰,我理解,但你肯定激起了我的好奇心!!!
    【解决方案2】:

    您实际上需要更改 scanf 的默认分隔符。这是您问题的确切答案。

    http://gpraveenkumar.wordpress.com/2009/06/10/how-to-use-scanf-to-read-string-with-space/

    【讨论】:

    • 我知道当一个人分配给单个变量时它是如何应用的,但我很难看到它如何用于调节对许多变量的分配。您能否提供一个如何正确使用该语法来执行此操作的示例?
    • 实际上你的问题不是很清楚......你能用一些例子解释更多吗?需要输入多个不同分隔符的变量吗?
    • @perreal 提供了一个工作示例。不过,感谢您的链接!
    • 1) 该页面中的示例错误(字符串说明符之前的空格没有任何作用,它是"%[]",而不是"%[]s",甚至在cmets 中)2 )您可以编辑您的 cmets 而不是编写新的 cmets 3)让人们选择您的答案是否有用。 :)
    【解决方案3】:

    您可以在 rect parentesis 之间使用它来“转义”字符分隔符,但老实说,我从未使用过该解决方案。 相反,您可以使用fgetssscanf。在我看来,这是一种更“可靠”的方式。 fgets 可以从标准输入读取,sscanf 可以在字符串中查找逗号和任何其他字符。 同样, fgets 使用 ctrl+c 返回 null , sscanf 返回成功读取的次数。 希望这可以帮助。

    【讨论】:

    • 谢谢,我会研究这些替代方案。但是,逃生命令正是我想要的!
    • 很高兴我能帮上忙。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2022-09-29
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多