繁体   English   中英

用scanf读取int直到换行

[英]read int with scanf until new line

我是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

提前致谢

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);
}

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

对于您想要从键盘输入的操作,我建议您读入一个字符串

char string[100];

scanf("%s",string)

那么您可以使用以下命令遍历字符串以查找数字

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

这里的棘手问题是,在获得第一个整数之后,您需要找出数字第一个空格的位置..说它在开始后是n个字符,那么您可以重复

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

并测试sscanf的值以查看是否已正确读取某些内容。

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

我这样做是从文件中读取的,但是在这里您必须要小心,因为对于文件,行尾字符可以是ascii代码10、13,也可以是unix,mac和msdos格式文件的10和13。对不起,我不记得是哪个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM