【问题标题】:read int with scanf until new line用 scanf 读取 int 直到换行
【发布时间】:2015-10-09 22:23:58
【问题描述】:

我是c语言的新手,以前用过java,所以我对一些东西不太熟悉……我想读取一个不定数的整数,直到有新的一行。我知道,新行是 ⁄n 并且我已经有一个代码,因此在您输入字母之前会读取整数,但如果有新行,它不会停止。

#include <stdio.h>

int main() {

int i, numberOfNumbs=0,total=0,value, valsRead;
float average;

valsRead = scanf("%d",&value);

while(valsRead>0)
{
numberOfNumbs++;
total +=value;
printf("Read %d\n", value);
valsRead = scanf("%d",&value);
}

average=(float)total/(float)numberOfNumbs;
printf("You read %d values. Average = %f.",numberOfNumbs, average);

return (0);
}

输入应该是这样的: 23 4 114 2 34 3224 3 2 /n

提前致谢

【问题讨论】:

  • fgets() 不只是用于文件吗?我想从终端读取它...对不起,如果我错了:O
  • stdin 文件或流。它是默认的控制台输入,并且已经“打开”。

标签: c string int newline scanf


【解决方案1】:

scanf不是线导向的设计。它针对空格分隔的输入,其中空格是空格、制表符、\r 或 \n 的任意组合。

如果你想使用面向行的输入,你应该使用fgets 来获取字符串中的一行,然后使用 strtok 和 sscanf 来解析字符串。你的代码可能变成:

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

/* maximum size of an input line : adapt to your needs */
#define SIZE 256

int main() {

    int i, numberOfNumbs=0,total=0,value, valsRead;
    float average;
    char line[SIZE], *val;
    char delims[] = " \t\r\n";

    if (fgets(line, SIZE, stdin) == NULL) { /* EOF */
        fprintf(stderr, "No input\n");
        return 1;
    }
    if (line[strlen(line) - 2] != '\n')  {/* line too long */
        fprintf(stderr, "Line too long\n");
        return 2;
    }
    val = strtok(line, delims);
    valsRead = sscanf(val, "%d",&value);

    while(valsRead>0)
    {
        numberOfNumbs++;
        total +=value;
        printf("Read %d\n", value);
        val = strtok(NULL, delims);
        valsRead = (val == NULL) ? 0 : sscanf(val, "%d",&value);
    }

    average=(float)total/(float)numberOfNumbs;
    printf("You read %d values. Average = %f.",numberOfNumbs, average);

    return (0);
}

【讨论】:

  • 如果我尝试编译它,编译器会给我一些错误:/
  • @bli77 :现在应该会更好 - 看起来我应该先尝试编译 ;-)
  • 谢谢你,它可以工作 ^^ 虽然我不得不注释掉“line to long”的 if 循环,否则你总是会得到错误,不管你输入什么
  • 注意:line[strlen(line) - 2] 可能会导致line[-1] 或很少会导致line[-2] 并导致问题。建议line[strcspn(line, "\r\n")] = 0;
【解决方案2】:

对于您想要从键盘输入的操作,我建议使用

读取字符串
char string[100];

scanf("%s",string)

然后你可以通过字符串查找数字,例如,命令

sscanf(string,"%d",&integer)

这里的棘手之处在于,在你获得第一个整数后,你需要找出第一个空格在 你的数字之后的位置。说它是开始后的 n 个字符,然后你可以重复与

sscanf(string+n,"%d",&integer)

并测试 sscanf 的值以查看是否正确读入。

这不是一个完整的答案,而是不同策略的建议。

我做这种从文件读入的事情,但在这里你必须小心,因为对于 unix、mac 和 msdos 格式,文件行尾字符可以是 ascii 代码 10、13 或 10 和 13文件(对不起,我不记得哪个是哪个。

【讨论】:

    【解决方案3】:

    如果你想要多个值,那么最好使用数组, 如果在输入新行之前想要值 '\n'scanf("%[^\n]", string);

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2013-11-30
      相关资源
      最近更新 更多