C -用scanf读取整型,直到换行



我是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 %dn", 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 32/n

Thanks in advance

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[] = " trn";
    if (fgets(line, SIZE, stdin) == NULL) { /* EOF */
        fprintf(stderr, "No inputn");
        return 1;
    }
    if (line[strlen(line) - 2] != 'n')  {/* line too long */
        fprintf(stderr, "Line too longn");
        return 2;
    }
    val = strtok(line, delims);
    valsRead = sscanf(val, "%d",&value);
    while(valsRead>0)
    {
        numberOfNumbs++;
        total +=value;
        printf("Read %dn", 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);
}

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

读取字符串
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(对不起,我不记得哪个是哪个了)。

如果你想要多个值,那么最好使用array,此外,如果想要值,直到你进入新的行'n'scanf("%[^n]", string);

最新更新