Scanf更多值C.

时间:2014-03-12 18:44:19

标签: c scanf

我需要C中的短代码帮助。我必须读取与空格分开的输入行上的浮点数,输入以浮点0或EOF结束。

如果我不知道有多少数字或输入,或者它是如何工作的,如果我只读数字而不是字符,请问EOF,如何做到这一点?

感谢您的回复。

一行输入示例:

12 11 10 45 50 12 EOF
12 10 11 45 0 

int main(void)  
{
    float num;
    float sum = 0;

    do{
       scanf("%f", num);
       sum += num;
    } while(EOF || num == 0);
    return 0;
}

6 个答案:

答案 0 :(得分:1)

来自scanf -

的手册页
  

scanf返回成功匹配和分配的项目数   它可以少于提供的数量,或者甚至为零   早期匹配失败。如果输入结束,则返回值EOF   在第一次成功转换或匹配之前到达   失败发生。

这意味着scanf只有在遇到EOF作为第一个输入时才会返回EOF,因为 EOF前面必须有换行符' \ n'否则它不会起作用(取决于操作系统)。您还必须考虑到scanf可能遇到的匹配失败。

#include <stdio.h>

int main(void) {
    float num;
    float sum = 0;
    int val;

    while((val = scanf("%f", &num)) != EOF && val == 1) {
        sum += num;
    }

    if(val == 0) {
        printf("matching failure. input is not a float.\n");
    }
    else {
        printf("end of input.\n");
    }

    return 0;
}

答案 1 :(得分:0)

来自scanf reference

  

成功时,该函数返回参数的项数   列表已成功填写。此计数可以匹配预期的数量   由于匹配失败,读数,项目或更少(甚至为零)   错误,或文件结尾的范围。

     

如果发生读取错误或达到文件结尾   阅读,设置正确的指标(feof或ferror)。而且,如果有的话   在成功读取任何数据之前发生,返回EOF。

     

如果解释宽字符时发生编码错误,则   函数将errno设置为EILSEQ。

因此,您可以将do-while循环重写为

int retval;
while((retval = scanf("%f", &num)) != EOF && retval > 0 && num != 0) {
    sum += num;
}

if(retval == 0) {
    printf("input read error.\n");
}

以匹配您的约束。

另请注意,在将变量传递给&时,需要为变量添加scanf()前缀,因为函数需要一个指针来处理(需要传递变量地址)。

修改

请参阅有关Windows中EOF问题的this topic

答案 2 :(得分:0)

您可以像这样重写代码

         int main(void) 
         {
            float num;
            float sum = 0;
            do
            {
               scanf("%f", &num);
               sum += num;
            } while((!feof(stdin)) && (num != 0));

            printf("%f", sum);
            return 0;   

          }

这里feof表示输入流的结束。

答案 3 :(得分:0)

以下可能是一种稍微强一些的方法:

#include <stdio.h>
#include <string.h>

int main(void) {
  int sum=0;
  int num;
  char *p;
  char buf[1000];
  fgets(buf, 1000, stdin);
  p = strtok(buf," ");
  while(p!=NULL) {
    if(sscanf(p, "%d", &num) == 1) sum+=num;
    p = strtok(NULL, " ");
  }
  printf("the sum is %d\n", sum);
}

测试:

> testme 
1 2 3 4 0

the sum is 10

> testme 
1 2 3 4 ^D
the sum is 10

注意 - 您必须输入ctrl-D 两次才能在一行结束时获得所需的效果。

答案 4 :(得分:0)

通过阅读“K N King的现代方法C编程”,您可以清楚地了解您的疑问

本书对此主题进行了适当的澄清

答案 5 :(得分:0)

scanf()01测试EOF的结果。
测试扫描的值0.0

int main(void) {
  float num;
  float sum = 0;
  int cnt;

  while ((cnt = scanf("%f", &num)) == 1) {
    if (num == 0.0) break;
    sum += num;
  }

  // cnt should be EOF, 0 or 1      

  if (cnt == 0) {
    printf("Input is not a number\n");
  }
  else {
    printf("Sum %f\n", sum);
  } 
  return 0;
}

虽然通常scanf()返回值EOF,0,1,...“格式说明符数”,但很少出现值0。示例输入为“+”。