如何知道scanf何时中止?

时间:2013-10-08 10:38:19

标签: c

scanf("%d",&n);

如果用户输入'E',那么n会存储什么? 当用户输入'E'并输入整数时,我必须停止输入。

3 个答案:

答案 0 :(得分:2)

scanf返回匹配元素的数量。

  

返回值

     

这些函数返回成功匹配的输入项数   和分配,可以少于提供,甚至零   早期匹配失败的事件。

您可以执行以下操作:

while(scanf("%d", &n) == 1) {
    // do something with n
}

答案 1 :(得分:1)

您必须检查scanf返回的内容。如果您键入“E”并拥有%d,那么您将拥有所谓的匹配失败。 检查以下scanf手册页(它适用于linux,但通常应该是相同的):scanf man page

答案 2 :(得分:-2)

您需要从scanf获取有关两件事的信息:

  1. 是否为n
  2. 分配了任何内容
  3. 消耗了多少个字符(如果您使用的是sscanf)。
  4. scanf返回已执行的分配数。因此,如果它在分配给n时完全成功,它将返回1,否则它将返回0.

    我在这里假设输入应该是写为mantissaEexponent的浮点,但这只是为了说明的目的。对于标准输入(scanf):

    int mantissa, exponent;
    int mantissaSet = 0, int exponentSet = 0;
    mantissaSet = scanf("%d", &mantissa); 
    char c = getc();
    if (c != EOF && c == 'E') {
      exponentSet = scanf("%d", &exponent);
    }
    if (mantissaSet) { ... /* mantissa was set */ }
    if (exponentSet) { ... /* exponent was set */ }
    

    从字符串获取输入时,如果输入中有一个输入,则需要知道在哪里查找'E',因此您需要添加%n转换才能获取此信息。下面的代码说明了它如何用于字符串(sscanf):

    const char * string = "1234E56";
    int mantissa, exponent;
    int mantissaSet = 0, exponentSet = 0;
    int charCount = 0;
    int mantissaSet = sscanf(string, "%d%n", &mantissa, &charCount);
    if (string + charCount == 'E') {
       exponentSet = sscanf(string + charCount + 1, "%d%n", &exponent, &charCount);
       ...
    }